【发布时间】:2017-06-19 12:50:17
【问题描述】:
我的问题是关于这两种情况:
#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;
}
case1: 当它是 foo1() 的情况下,我们得到一个错误,因为我们试图将地址的副本返回给 main 其数据已被删除(当我们退出 foo1() 函数时)
case2: 但是在 foo2() 中,它不会给出错误,尽管我们正在返回一个指向局部变量指针的副本,该指针的数据将在之后被删除我们退出 foo2() 函数,为什么会这样?
TL;DR:为什么 foo2() 没有给出错误,但 foo1() 给出了?
TIA。
【问题讨论】:
-
C 还是 C++?还有,g++,gives a warning for both
-
我相信这与 foo1 返回一个右值而 foo2 返回一个左值这一事实有关,这是一个有效的返回即使指针地址本身无效。
-
为什么是双标签?
-
@Olaf:当然。从 K&R 开始,做示例练习。
-
@valacmur98 “虽然它是未定义的,但它没有给出错误,所以我想澄清一下”。如果 C 指定了一个错误,那将是定义行为。未定义的行为意味着不需要错误。你可能得到一个,你可能不会。
标签: c pointers memory-management function-pointers