看到一个这个题目:
问下面四个函数能正确返回的是:
const char* func()
{
const char* buff = "hello world";
return buff;
}
char *func2()
{
char buff[] = "hello world";
return buff;
}
char *func3()
{
static char buff[] = "hello world";
return buff;
}
string& func4()
{
string buff("hello world");
return buff;
}
答案是1、3;
之前了解的是,const char* buff 定义的是局部变量,在函数结束后应该是被销毁了的,为什么能正常返回呢?
根据上面运行的结果可知,定义的buff变量,跟字符串常量,以及返回的结果的地址都是同一个。
变量buff在函数结束后,肯定是被销毁了,但是字符串常量是存在常量区的,在程序结束前都可以访问。
这就是为什么第一个函数的可以正常返回。
这里再记录一下c/c++的几个存储区域说明:
1、栈区
主要存储局部变量、形参
2、堆区
由程序员自己分配例如,malloc()、new()。需要自己主动释放
3、全局/静态存储区
bss段:未初始化的全局变量和未初始化的静态变量存放在这里
初始化为0的全局变量和初始化为0的静态变量存放在bss段
data段:已初始化的全局变量和静态变量存放在data段
注:data需要占用可执行文件文件,其内容由程序初始化。因此同一个全局变量是否赋初值可导致可执行文件的大小发生改变
4、常量存储区
字符串、数字常量存放在常量区。const修饰的全局变量存放在常量区。
5、代码区