一道C面试题引发的思考

char   *strA()
{
    char   str[]   =   "hello   word ";
    return   str;

       很明显出错了,返回指向局部变量的指针。
这个str里存的地址   是函数strA栈桢里 "hello       word   "的首地址
函数调用完成   栈桢恢复到调用strA之前的状态
ebp   esp   被重置  
堆栈 "回缩 "
strA   栈桢不再属于应该访问的范围
存于strA栈桢里的 "hello       word   "当然也不应该访问了

正确的写法:

const char* strA()
{
   
char* str = "hello word";
   
return str;
}

char* strA()
{
   
static char str[] = "hello word";
   
return str;
}

char* strA()
{
   
char* str = new char[128];
    strcpy(str,
"hello word");
   
return str;

 

关于char* str = "hello word";

一般来讲,修改这样的串是不允许的(有的编译器可以修改). "hello   word "在全局数据区

---------------  
                    Heap                   ¦  
---------------  
                    Stack                 ¦  
---------------  
                                Const     ¦(字符串常量通常放在data-const区中)  
        data--Common   ¦  
                                Data       ¦  
---------------  
                    Code                   ¦  
---------------  
既然是全局,那在strA之外自然也能访问的拉,注意与在栈里的串的区别

可以认为这是C++语法上的一个歧义,不过也可以认为是一种方便.
char   c[]   =   "hello   world ";
是分配一个局部数组.
char   *c   =   "hello   world ";
是分配一个全局数组.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值