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