1
#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'指向的栈空间。在我看来,这段代码会出现一些错误。但为什么不呢?

这个问题让我扭曲了很长时间。如果你能告诉我原因,我会感激你的好心。

4

2 回答 2

5

p不指向堆栈空间。它指向字符串字面量"hello"。由于保证字符串文字在整个程序中都有效,因此您的程序是可以的。

(我不了解 Dev-C++,但在大多数编译器中,字符串文字在程序加载时分配在一些只读内存中,并一直留在那里直到它结束)

编辑:请注意,即使字符串在堆栈上,并且代码确实存在错误,语言保证中的任何内容都不会起作用。无效内存可以(但不是必须)仍然包含它在无效之前包含的值。

于 2012-06-13T11:51:45.330 回答
0

字符串“hello”不是堆栈分配的(但char *p指针是)。
它位于“数据段”中,因为它是一个常量值(只读存储器)。
来自 C 常见问题解答:http ://c-faq.com/decl/strlitinit.html

于 2012-06-13T12:01:33.547 回答