#include<stdio.h>
#include<stdlib.h>
char* re()
{
char *p = "hello";
return p;
}
int main()
{
char* tem = re();
printf("%s", tem);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的编译器是Dev-C++.我认为,"重"的功能完成时,"P"的指针将被删除,也将被删除其中"P" HAVS指向的堆栈空间.因此'tem'的指针不能访问'p'指向的堆栈空间.在我看来,这段代码会出现一些错误.但为什么不呢?
这个问题困扰了我很久.如果你能告诉我原因,我将感激你的善良心.
p
不指向堆栈空间.它指向字符串文字"hello"
.由于字符串文字保证在整个程序中有效,因此您的程序没问题.
(我不知道Dev-C++,但在大多数编译器中,字符串文字在加载程序时分配在一些只读内存中,并保持到那里直到它结束)
编辑:请注意,即使字符串在堆栈上,并且代码确实是错误的,语言中没有任何内容可以保证不起作用.无效内存可以(但不一定)仍然包含它在无效之前包含的值.