【发布时间】:2021-09-29 21:44:11
【问题描述】:
我有一个关于按地址从函数返回局部变量的问题。 我知道每个局部变量都有一个生命周期。 但是当我返回一个数组并直接打印例如第一个和第二个单元格时,我仍然得到值。 但是当我只添加一行时,它已经被破坏了。 问题是为什么一旦函数关闭就不会发生这种情况。
int* f1();
int main(){
int *p=f1();
printf("%d %d\n",p[0],p[1]);
return 0;
}
int* f1(){
int arr[4]={1,2,3,4};
return arr;
}
输出:1 2
int* f1();
int main(){
int *p=f1();
printf("hey\n"); // **add this line**
printf("%d %d\n",p[0],p[1]);
return 0;
}
int* f1(){
int arr[4]={1,2,3,4};
return arr;
}
输出:1 11788742452
【问题讨论】:
-
您不能返回指向局部变量的指针。一旦函数完成,局部变量就不再存在。你看到的是未定义的行为。您已经看到了可以随时覆盖的剩余部分。在第二个程序中你可以看到添加的 printf 已经覆盖了剩余的
-
正如您所写,该数组不再有效。你很不幸得到了你想要的结果。 Sh*t 发生了。未定义的行为没有任何保证:结果可能是对的,可能是错的,也可能是天崩地裂。通常,如果内存没有被覆盖的原因,您会得到想要的结果,这可能是任意数量的事情。
-
我知道我不能返回一个局部变量的指针,问题是为什么当我返回并直接打印第一个和第二个单元格时我仍然得到正常值,但是当我添加一行示例打印然后打印第一个和第二个单元格的值我得到垃圾值。 @Jabberwocky
-
在一种情况下内存被重用,在另一种情况下(还没有)。旁注:如果你闯红灯,你并不总是被卡车压扁。
-
@רוניג'קויטולי 刷新浏览器并阅读我更新的评论
标签: arrays c memory return undefined-behavior