【问题标题】:why can't I initialize the array like this? [duplicate]为什么我不能像这样初始化数组? [复制]
【发布时间】:2015-02-09 14:31:00
【问题描述】:
#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 编译器中。但我可以这样分配

 int array[5]={0};

如果有人纠正我?

【问题讨论】:

  • 在编译这个程序时使用-std=c99作为CFLAGS
  • @Bhuvanesh 您是否使用 cc -E 检查了您的代码。在此变量中没有要放置在数组大小中的值。

标签: c arrays


【解决方案1】:

此声明

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};

那么就没有变长数组了。数组的大小在编译时是已知的。所以没有问题

.

【讨论】:

  • 但是我们可以将数组声明为array[a];,但问题是在我们初始化的时候只会出现错误
  • @Bhuvanesh:Vlad 提到的引文明确指出您无法初始化可变长度数组。
  • 作为唯一一个回答实际问题的人做得很好。
  • @Bhuvanesh 查看我更新的帖子。
  • @Cornstalks 我更新了我的帖子,因为起初我没有解释为什么不能这样做。
【解决方案2】:

“在 ISO C99 中允许使用可变长度的自动数组,并且作为一个 扩展 GCC 在 C90 模式和 C++ 中接受它们"

here.

编译器在某些情况下可能会有所不同。可变大小数组出现问题是正常的。如果您确实需要这样做,这应该可以工作

#include<stdio.h>
#DEFINE A 5

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

【讨论】:

  • 与编写 int a[5] = {0} 相同,因为预处理器将在编译时自行解析。
  • 这应该可以工作如果你真的需要这样做
【解决方案3】:

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

【讨论】:

  • @Akilesh Jaiswal - 但两者都是局部变量。这将在运行期间工作
  • 因为数组是静态内存块,其大小必须在编译时确定,在程序运行之前。 :)
  • 这是一个 VLA,因此数组大小不必是常量表达式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-12
  • 2012-01-07
  • 1970-01-01
  • 2012-06-24
  • 2013-09-14
  • 2019-06-28
相关资源
最近更新 更多