c语言和一些指针的疑惑

时间:2012-06-13 11:48:46

标签: c pointers

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

这个问题困扰了我很久。如果你能告诉我原因,我将感激你的善良心。

2 个答案:

答案 0 :(得分:5)

p未指向堆栈空间。它指向字符串文字"hello"。由于字符串文字保证在整个程序中有效,因此您的程序没问题。

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

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

答案 1 :(得分:0)

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