【发布时间】:2021-07-15 13:16:16
【问题描述】:
我用 C 编写了这段代码:
#include <stdio.h>
int* fun() {
int x = 43;
int* ret = &x;
return ret;
}
int main() {
int* r = fun();
printf("%d", *r);
return 0;
}
原来的代码是:
#include <stdio.h>
int* fun() {
int x = 43;
return &x;
}
int main() {
int* r = fun();
printf("%d", *r);
return 0;
}
我通过这样做修复了“返回本地指针”警告
int* ret = &x;
现在我的问题是,在第一个示例中,代码打印 43,我不明白为什么?在函数“fun”执行并从堆栈中删除后,指针不应该是指向垃圾值的指针,因为变量“x”被破坏并且不再保存值 43 吗?那么为什么在“fun”执行后取消引用指针“r”会导致 43 ?为什么这个包含变量“x”的内存块即使在函数“fun”从堆栈中移除后仍然没有被移除?
【问题讨论】:
-
43和-7652342或任何其他数字一样多:-) -
这是未定义的行为。你只是幸运。内存是按页保护的。它仍然存在,但可能会导致段错误。
-
堆栈内存永远不是
removed- 它只是为下一步需要的任何东西提供(不变)。 -
从技术上讲,内存位置已被释放,但还没有人向其写入任何内容,因此它仍保持先前的值。但这是未定义的行为,在其他情况下您可能会得到完全不同的值。
标签: c pointers memory memory-management