Can';无法理解此代码堆栈存储函数调用c的输出
我有下面的代码,但是我不明白它输出什么以及为什么输出它的功能Can';无法理解此代码堆栈存储函数调用c的输出,c,function,stack,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和一个垃圾值。有人能解释一下结果吗 它不应该同时返回垃圾值吗 我知道k是fun()本地的,所以它会存储在堆栈上,当fun()超出范围时,它
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()
超出范围时,它会被销毁。我在这里遗漏了什么概念
它不会同时返回垃圾值吗
返回fun
后,k
不再存在,因此打印存储在k
地址中的值是未定义的行为
这就是为什么你有不同的垃圾值
k是fun()的局部变量,因此它将存储在堆栈中,当fun结束时,激活将被破坏,或者我是否缺少一些概念
您没有遗漏任何东西,除了堆栈不会立即“作废”或类似的事实。换句话说,在返回
fun
后,编译器可以自由地使用该内存执行任何操作。当函数返回时,堆栈不会立即清除,因此12
在fun()
返回后仍将在堆栈上,直到其他内容覆盖它
您将在不同的编译器和不同的构建选项(调试与发布)中看到不同的结果。但每次运行时,我都会得到12,垃圾值。每次第一次打印时,它都会返回12。我不明白。我甚至在TC上编译并运行了它,对于第一个printf和一个垃圾值,它给出了相同的答案12?@ishansoni-这就是未定义的行为-你真的不知道会发生什么,还有谁会改变这个内存,当你试图改变它时会发生什么,或者,如果您取消引用指针
i
,我在某个地方读到,在printf语句之后调用了in-TC垃圾收集器,所以这可能就是原因。