#include<stdio.h>
#include<stdlib.h>
char* re()
{
char *p = "hello";
return p;
}
int main()
{
char* tem = re();
printf("%s", tem);
return 0;
}
我的编译器是 Dev-C++。 我认为当're'函数完成时,'p'的指针将被删除,'p'指向的堆栈空间也将被删除。所以'tem'的指针不能访问'p'指向的栈空间。 在我看来,这段代码会出现一些bug。但为什么不呢?
这个问题困扰了我很久。如果你能告诉我原因,我将感谢你的好心。
最佳答案
p
不指向堆栈空间。它指向字符串文字 "hello"
。由于保证字符串文字在整个程序中都是有效的,因此您的程序是可以的。
(我不知道 Dev-C++,但在大多数编译器中,字符串文字在程序加载时分配在一些只读内存中,并一直保留到程序结束)
编辑:请注意,即使字符串在堆栈上,并且代码确实存在错误,语言中的任何保证都不会起作用。无效内存可以(但不是必须)仍然包含它在无效之前包含的值。
关于c语言与指针的一些疑惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11014203/