【发布时间】:2016-10-25 04:32:10
【问题描述】:
我不知道为什么会这样。由于 x 是一个局部变量,我想当我尝试返回它时会出错。但是,第一个 printf 工作正常,但它只打印出 0。谁能解释这里发生了什么?
#include <stdio.h>
int* func1() {
int x = 123123;
int *y = &x;
return y;
}
int main()
{
int* c = func1();
printf("%d\n", *c); // output: 123123
printf("%d\n", *c); // output: 0
return 0;
}
【问题讨论】:
-
在使用局部变量所在的空间时没有发生任何事情。然后,发生了一些事情。
-
什么意思? 0.o
-
行为未定义。您正在引用堆栈上对您不可用的存储。在其他东西触及它之前,它可能仍然保留早期函数调用的值,但你不能指望它。显然,您对
printf的调用有时会覆盖该存储。这是一个错误。只需修复它并继续生活。 -
c的分配是 UB。 -
这是个好问题。变量的范围似乎存在问题。不要将局部变量地址返回给其他函数。因为局部变量的范围有限,一旦函数调用完成,它将破坏内存或分配给其他人。
标签: c