谁能帮我理解这些程序的输出。
int* fun1();
void fun2();
int main()
{
int *p=fun1();
fun2();
printf("%d\n",*p);
return 0;
}
int* fun1()
{
int i=10;
return &i;
}
void fun2()
{
int a=100;
printf("%d\n",a);
}
在 Windows 上是 100 100,在 Linux 上是 100 10。由于局部变量是在堆栈上分配的,因此我能够证明 Windows 输出是合理的。但是在 Linux 中为什么是 100 10。
最佳答案
返回指向超出范围的堆栈分配变量的指针并使用该指针是未定义的行为,纯粹而简单。
但我猜答案“任何事情都有可能发生”对你来说并不合适。
发生的事情是,在 *nix 上,内存没有被回收,所以它还没有被覆盖,而在 win 上,它被覆盖了。但这只是一个猜测,您最好的选择是使用调试器并遍历汇编代码。
关于c - linux中进程是如何分配栈的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8063957/