解释输出

sch*_*ger 0 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);
}
Run Code Online (Sandbox Code Playgroud)

运行代码后输出:

3
-1073855580
Run Code Online (Sandbox Code Playgroud)

我知道a [2]对于fun()来说是局部的,但是为什么值会改变相同的指针?

Chr*_*rle 7

变量a确实是乐趣的本地变量.从该函数返回时,将弹出堆栈.记忆本身保持不变(暂时).当您第一次取消引用时,内存就是您期望的内存.由于取消引用发生调用printf 之前,所以没有任何不好的事情发生.当printf执行时,它会修改堆栈并清除值.第二次通过你看到第一次通过printf发生的任何价值.

"正常"调用约定的事件顺序(我知道,我知道 - 没有这样的事情):

  • 取消引用r(第一次通过,这应该是什么)
  • 将值推入堆栈(注意这是复制值)(可能会消除a)
  • 将其他参数推送到堆栈(订单通常是从右到左,IIRC)(可能会消除a)
  • 在堆栈上为返回值分配空间(可能会消除a)
  • 打电话给printf
  • 将本地printf变量推入堆栈(可能会消除a)
  • 做你的
  • 从功能返回

如果int a[2];改为static int a[2];这将缓解问题.