c语言与指针的一些疑惑

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

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

最佳答案

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

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

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

关于c语言与指针的一些疑惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11014203/

相关文章:

c - 段错误——无法将一个文件的内容写入另一个文件

c++ - 指向基点的指针可以指向派生对象数组吗?

c++ - 空指针检查线程安全

c - 在 C 中减去两个指针时

c++ - 关于指针和数组

c - 如何在 Makefile.am 中使用条件

C 非标准库

c - getchar() != EOF K&R

c++ - 尝试实现

c++ - "this"指针占用内存