一道C面试题引发的思考

来源:互联网 发布:阿里云内容禁止访问 编辑:程序博客网 时间:2024/05/17 03:16

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 ";
是分配一个全局数组.

原创粉丝点击