c - 解释输出

标签 c

#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/

相关文章:

c - 读至换行符

c - 自然对数 - 奇怪的输出

c - C中通过文件进行多项式赋值

比较数字与特殊字符

c - 这个 C 结构赋值是什么意思?

C 程序产生两个进程树而不是一个

c - 如何对最后一个 else 语句不执行任何操作,然后继续处理数组的下一部分?

c - C 语言的欧拉计划 145

c - 什么时候调用_pclose?

c - 如何使用 clutter_actor_animate 移动窗口/舞台?