C - 返回本地指针与局部变量

ymd*_*tta 0 c pointers memory-management function-pointers

我的问题是关于这两种情况:

#include <stdio.h>
int *foo1();
int *foo2();

int main()
{
   printf("so it's %d\n",*foo1());
   printf("so it's %d\n",*foo2());
}

int *foo1()
{
   int i1 = 5;
   return &i1;
}

int *foo2()
{
   int i2 = 5;
   int *p = NULL;
   p = &i2;
   return p;
}
Run Code Online (Sandbox Code Playgroud)

case1: 当它是foo1()的情况时,我们得到一个错误,因为我们试图将一个地址副本返回给main,其数据已被删除(当我们退出foo1()函数时)

case2:但是在foo2()中,虽然我们将一个副本返回到一个局部变量的指针,但是在我们退出foo2()函数后它们的数据将被删除,但它没有给出错误,为什么会这样呢?

TL; DR:为什么foo2()不会给出错误但是foo1()呢?

TIA.

Bat*_*eba 9

两种功能的行为foo1foo2未定义的,在C和C++.

不能取消引用指向具有不再在范围内的自动存储持续时间的变量的指针.

明天,foo2()也许会给你一个错误.或者编译器可能会吃你的猫.