为什么在C中错误的数组动态分配没有标记错误?

时间:2017-11-11 06:37:36

标签: c arrays memory-management

#include<stdio.h>
void main(){
    int n = 0;
    scanf("%d",&n);
    int a[n];
    printf("Number of elements in array is %ld\n",sizeof(a)/sizeof(int));
}

我已经在上面展示了一种在C中动态分配数组的错误方法。动态分配的正确方法是使用malloc。在数组的当前声明中(由于C的语法),变量&#34; a&#34;应该在编译时分配但不在运行时分配。所以它应该在数据段中。但动态分配的任何东西都在堆中。我有两个问题:

  1. 变量&#34; n&#34;必须是一个常数,以便&#34; a&#34;在编译期间在数据段中分配,而不是在运行时分配。该程序编译没有错误。为什么在编译时没有标记错误或至少发出警告?

  2. 我执行了这段代码并为n赋予了一个值,但发现为数组分配的元素数量为&#34; a&#34;正是n。这是怎么回事?分配的数组在哪里?

  3. 我在ubuntu 16.04中使用gcc编译器5.4.0。

1 个答案:

答案 0 :(得分:3)

1的答案是: -

没有标记错误,因为您的编译器了解C99代码。这被称为VLA(可变长度阵列)。它自C99以来一直受到支持。 (VLA是C99特定语言功能)。模式为gnu11(默认情况下)。

在内部,它也使用了一些分配(使用alloca等)。

默认情况下,您的编译器以C99模式运行。检查编译器的选项以切换到严格C89或其他模式。你会收到一个错误。

第二个问题的答案非常明显,因为您指定的数组大小为n而不是n-1n+1。所以它为你分配了大量的内存。