无法理解此代码堆栈存储函数调用c的输出

时间:2012-08-12 19:50:35

标签: c function stack

我有以下代码,但是我不明白为什么以及它输出它的原因。

int main(){
   int *i;
   int *fun();
   i=fun();
   printf("%d\n",*i);
   printf("%d\n",*i);
}

int *fun(){ 
   int k=12;
   return(&k);
}

输出为12且为垃圾值。有人可以解释输出吗?

它不应该两次都返回垃圾值吗?

我知道kfun()的本地,因此它将存储在堆栈中,并且当fun()超出范围时它将被销毁。我在这里错过了什么概念?

2 个答案:

答案 0 :(得分:5)

  

它不会同时返回垃圾值吗?

返回fun后,k不再存在,因此打印存储在k地址中的值为未定义的行为。< / p>

这就是你有不同/垃圾价值的原因。

  

k是fun()的本地,所以它会被存储在堆栈中,当游戏结束时,激活会被破坏,或者我错过了一些概念?

你没有遗漏任何东西,除了事实上,堆栈没有被立即“废止​​”,或类似的东西。换句话说,在fun返回之后,编译器可以随意使用这个内存做任何事情。

答案 1 :(得分:4)

当函数返回时,堆栈不会被立即清除,因此12fun()返回后仍将在堆栈中 - 直到其他东西覆盖它。

您会在不同的编译器和不同的构建选项(调试与发布)中看到不同的结果。