如果我有以下内容:
int *test()
{
int d = 10;
int a[d];
a[0] = 10;
a[1] = 20;
printf("%p\n", a);
return a;
}
int main(void)
{
int *a = test();
printf("%p %d\n", a, a[0]);
return 0;
}
当我从a
返回test
到main
时,在a
内为test
分配的内存不是
销毁。但为什么?不是a
一个自动存储变量,在块时死亡
功能退出?事实上,当我编译代码时,编译器警告我:
function returns address of local variable [-Wreturn-local-addr]
如果我使用静态数组,也会发生同样的事情。
答案 0 :(得分:3)
要求不是要记忆被破坏" (无论它意味着什么 - 用零填充?)标准只说明你的代码会触发未定义的行为 - 未定义的行为可能意味着任何事情,包括一段时间内存具有相同内容的情况。但仍然是未定义的行为,你的代码是错误的。
答案 1 :(得分:1)
C标准中没有要求“销毁”存储在超出范围的变量中的数据。
在超出范围后访问a
是不安全的。内存可以自由地用于其他目的。如果访问内存未指定,会发生什么。它可能会返回你放在那里的值,它可能会返回一些其他(垃圾)值,它可能会导致程序崩溃或者它可能会炸毁曼哈顿岛。
最后一个选项是不太可能的,我没有遇到任何生成代码的C编译器。
答案 2 :(得分:1)
a
是一个局部变量。 "本地"在功能本地。 a
返回后,test()
不再存在。因此,您返回一个指向不再存在的对象的指针,编译器正确地抱怨。
您可以将数组作为参数传递给test()
并在test()
内填充该数组,或者您可以在malloc()
内使用test()
在堆上主动分配内存,并且返回指向它的指针。请注意,调用者必须再次free()
表示内存以防止内存泄漏。