#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'指向的堆栈空间。 在我看来,这段代码会出现一些错误。但为什么不呢?
这个问题困扰了我很久。如果你能告诉我原因,我将感激你的善良心。
答案 0 :(得分:5)
p
未指向堆栈空间。它指向字符串文字"hello"
。由于字符串文字保证在整个程序中有效,因此您的程序没问题。
(我不知道Dev-C ++,但在大多数编译器中,字符串文字在加载程序时分配在一些只读内存中,并保持到那里直到它结束)
编辑:请注意,即使字符串在堆栈上,并且代码确实是错误的,语言中没有任何内容可以保证不起作用。无效的内存可以(但不一定)仍然包含它在无效之前包含的值。
答案 1 :(得分:0)
字符串“hello”不是堆栈分配(但是char *p
指针是)。
它位于'数据段'中,因为它是一个常量值(只读存储器)。登记/>
来自C FAQ:http://c-faq.com/decl/strlitinit.html