自动存储和C99 VLA阵列

时间:2014-03-18 09:53:30

标签: c

如果我有以下内容:

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返回testmain时,在a内为test分配的内存不是 销毁。但为什么?不是a一个自动存储变量,在块时死亡 功能退出?事实上,当我编译代码时,编译器警告我:

function returns address of local variable [-Wreturn-local-addr]

如果我使用静态数组,也会发生同样的事情。

3 个答案:

答案 0 :(得分:3)

要求不是要记忆被破坏" (无论它意味着什么 - 用零填充?)标准只说明你的代码会触发未定义的行为 - 未定义的行为可能意味着任何事情,包括一段时间内存具有相同内容的情况。但仍然是未定义的行为,你的代码是错误的。

答案 1 :(得分:1)

C标准中没有要求“销毁”存储在超出范围的变量中的数据。

在超出范围后访问a是不安全的。内存可以自由地用于其他目的。如果访问内存未指定,会发生什么。它可能会返回你放在那里的值,它可能会返回一些其他(垃圾)值,它可能会导致程序崩溃或者它可能会炸毁曼哈顿岛。

最后一个选项是不太可能的,我没有遇到任何生成代码的C编译器。

答案 2 :(得分:1)

a是一个局部变量。 "本地"在功能本地。 a返回后,test()不再存在。因此,您返回一个指向不再存在的对象的指针,编译器正确地抱怨。

您可以将数组作为参数传递给test()并在test()内填充该数组,或者您可以在malloc()内使用test()在堆上主动分配内存,并且返回指向它的指针。请注意,调用者必须再次free()表示内存以防止内存泄漏。