C 语言中函数运行结束后的临时变量空间不释放吗?

2018-05-31 14:43:28 +08:00
 Weixiao0725

我有如下代码,输出两个 3,在函数 f()运行结束后,函数栈中的临时变量 a 指向的空间不会被释放吗?为什么 p 指向的地址空间仍然有效呢?

#include <stdlib.h>
#include <stdio.h>

int* p = NULL;

void f()
{
  int a = 3;
  p = &a;
  printf("%d\n", *p);
}

int main()
{
   f();
   printf ("%d\n", *p);
   return 0;
}
2318 次点击
所在节点    C
2 条回复
exch4nge
2018-05-31 15:18:12 +08:00
语言层面上你应该认为这个地址已经被释放了,所以语言层面上这么写是错的。更底层来讲,这个地址是栈上的地址,即使函数返回,这个地址是有效的,函数返回时出栈也不会清理里面内容,所以看似执行的还正确,不过不能保证在所有编译器与所有编译选项中都正确。如果还好奇的话,可以多去了解汇编。
Droi
2018-05-31 16:07:35 +08:00
p 地址与值会被其他值直接覆盖掉,不保证还是原来的值。
详细的可以看 wiki 迷途指针 https://zh.wikipedia.org/wiki/%E8%BF%B7%E9%80%94%E6%8C%87%E9%92%88

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/459238

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX