为什么我不能像这样初始化数组?

时间:2014-12-11 07:10:42

标签: c arrays

#include<stdio.h>

main() {
  int a=5;
  int array[a]={0};
  printf("Success\n");
}

当我执行程序时,它将通过错误

b.c: In function ‘main’:
b.c:8:1: error: variable-sized object may not be initialized
b.c:8:1: warning: excess elements in array initializer [enabled by default]
b.c:8:1: warning: (near initialization for ‘array’) [enabled by default]

在cc complier中。但我可以像这样分配

 int array[5]={0};

如果有人纠正我?

3 个答案:

答案 0 :(得分:4)

本声明

int array[a]={0};

声明一个可变长度数组(VLA)。

根据C标准(6.7.9初始化)

  

3要初始化的实体的类型应为数组   未知大小或完整对象类型不是可变长度   数组类型

问题是编译器应该在编译时知道数组大小,以生成初始化数组的代码。

考虑一个例子

void f( size_t n )
{
    int a[n] = { 1, 2, 3, 4, 5 };
    //...
}

这是一个可变长度数组。现在,由于n可以具有任何值,因此数组定义中的初始值设定项的数量可以大于数组的大小。因此,此代码从另一方面打破了标准,因为初始化程序的数量可能不会大于数组元素的数量。另一方面,如果初始化器的数量少于数组的元素数,那么在这种情况下该做什么呢?也许程序员并不意味着某些元素应该被零初始化。

至于此声明

int array[5]={0};

然后没有可变长度数组。数组的大小在编译时是已知的。所以没有问题

答案 1 :(得分:1)

  

“ISO C99允许使用可变长度自动数组,   扩展GCC在C90模式和C ++“

中接受它们

here.

编译器在某些情况下可能有所不同。对可变大小的数组有问题是正常的。如果你真的需要这样做,这应该有用

#include<stdio.h>
#DEFINE A 5

 main()
 {
 int array[A]={0};
 printf("Success\n");
 }

答案 2 :(得分:0)

方括号[]中的元素字段,表示数组中元素的数量,必须是常量表达式,因为数组是静态内存块,其大小必须在编译时确定,在程序运行之前。