我有以下代码,但是我不明白为什么以及它输出它的原因。
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()
超出范围时它将被销毁。我在这里错过了什么概念?
答案 0 :(得分:5)
它不会同时返回垃圾值吗?
返回fun
后,k
不再存在,因此打印存储在k
地址中的值为未定义的行为。< / p>
这就是你有不同/垃圾价值的原因。
k是fun()的本地,所以它会被存储在堆栈中,当游戏结束时,激活会被破坏,或者我错过了一些概念?
你没有遗漏任何东西,除了事实上,堆栈没有被立即“废止”,或类似的东西。换句话说,在fun
返回之后,编译器可以随意使用这个内存做任何事情。
答案 1 :(得分:4)
当函数返回时,堆栈不会被立即清除,因此12
在fun()
返回后仍将在堆栈中 - 直到其他东西覆盖它。
您会在不同的编译器和不同的构建选项(调试与发布)中看到不同的结果。