请问函数里定义的字符串常量会随着函数结束时自动消亡吗

来源:百度知道 编辑:UC知道 时间:2024/05/15 18:37:41
char *GetString(void)
{
char p[] = "hello world";
return p;
}
void Test4(void)
{
char *str = NULL;
str = GetString();
cout<< str << endl;
}

// char p[] = "hello world"; 这句helloworld 常量在静态区,会随着函数结束消失吗?

在windows环境下"hello world"在程序结束前不会消失

连接器在连接.exe文件时,将"hello world"存储在.exe文件(PE文件格式)的.rdata区内(只读存储区)。在运行这个.exe文件时,它被映射至进程的地址空间(一般为0x00400000处,所以"hello world"可能在类似0x00420C40处),直至程序运行结束,windows解除映射时,"hello world"才从进程的地址空间消除。所以说,它永久存在。

char p[] = "hello world";
return p;
编译器在编译此句时,产生的代码是类似于:
mov p,0x00420C40("hello world"),
即将"hello world"在进程地址空间的地址传给p,p在GetString函数退出后不存在(这也只是在高级语言的角度,汇编中p是在栈中所已退出函数后自然不存在),而0x00420c40处的内容却没人能改变,因为它是只读的,且直接对应于.exe文件

楼主可以做个实验:在GetString中查看"hello world"的地址(即p的值),
退回到main后再在调式器的memory察看窗口输入这个地址(一般为0x0042....),肯定能看到hello world\0的ascii码,注意:普通console程序,0x00120000左右的地址表示的是栈上地址,0x00400000之后的地址是.exe文件的映射,0x7c000000左右的地址是系统dll的变量与函数

其他操作系统的实现也大同小异。总之,"hello world"在程序运行期间一直存在

如果想放在静态区的话前面不是应该要有static关键字吗?如果p是静态的话不会随着函数结束而消失,但是程序结束的时候会消失

程序退出会自动清空内存的……所以你放心好了

会的
主函数一结束 内存就会释放空间