gpt4 book ai didi

c - 解释输出

转载 作者:太空宇宙 更新时间:2023-11-04 05:08:08 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com