0

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

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

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

输出是 12 和一个垃圾值。有人可以解释输出吗?

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

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

4

2 回答 2

5

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

的返回后funk不再存在,因此打印存储在地址中的值k未定义的行为

这就是为什么你有不同的/垃圾价值。

k 是 fun() 的本地变量,因此它将存储在堆栈中,并且在 fun 结束时激活将被销毁,还是我错过了一些概念?

除了堆栈没有立即“取消”或类似的事实之外,您没有遗漏任何东西。换句话说,在返回 之后fun,编译器可以自由地对这块内存做任何事情。

于 2012-08-12T19:52:23.377 回答
4

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

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

于 2012-08-12T19:55:25.677 回答