#include<stdio.h>
int * fun(int a1,int b)
{
int a[2];
a[0]=a1;
a[1]=b;
return a;
}
int main()
{
int *r=fun(3,5);
printf("%d\n",*r);
printf("%d\n",*r);
}
运行代码后的输出:
3
-1073855580
我知道 a[2] 是 fun() 的局部变量,但为什么同一指针的值会发生变化?
最佳答案
变量 a 确实是 fun 的局部变量。当您从该函数返回时,堆栈将被弹出。内存本身保持不变(暂时)。当您第一次取消引用 r 时,内存就是您所期望的。由于取消引用发生在 调用 printf 之前,因此不会发生任何不良情况。当 printf 执行时,它会修改堆栈并将值删除。第二次通过时,您会看到第一次通过 printf 时碰巧放在那里的任何值。
“正常”调用约定的事件顺序(我知道,我知道——没有这样的事):
- 取消引用
r
(第一次通过,这是应该的) - 将值压入堆栈(注意这是复制值)(可能会删除 a)
- 将其他参数压入堆栈(顺序通常是从右到左,IIRC)(可能会删除 a)
- 在堆栈上为返回值分配空间(可能会删除 a)
- 调用printf
- 将本地 printf 变量压入堆栈(可能会删除 a)
- 做你的事
- 函数返回
如果将 int a[2];
更改为 static int a[2];
这将缓解问题。
关于c - 解释输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6748900/