尝试将变量指定为C中数组的长度

时间:2013-08-14 02:27:33

标签: c arrays variables declaration

我正在尝试从用户那里获取n个特定数量的值,为此,我采用了简单的方法,并要求用户输入要输入的特定数量的值。 此数量的值保存在变量中,例如“ x ”:

int x;
printf("Enter the number of values to be entered: ");
scanf("%d", &x);
int array[x];

因此,当我尝试运行代码时,我收到以下消息:

需要常量表达式

为什么会这样?我怎么能解决它?

4 个答案:

答案 0 :(得分:3)

int array[x];

x不是编译时常量,编译器正在抱怨它。可变长度阵列是C99标准的一部分。看起来您的编译器不符合标准。

您可以使用malloc动态分配数组,然后使用free。或者使用支持VLA的编译器。

答案 1 :(得分:3)

此声明:

int array[x];

Variable length array(VLA),它是C99功能。没有VLA支持数组大小必须是编译时常量。 VLA上的DrDobb's article是一个很好的参考。

你提到你同时使用Borland C++Xcode,据我所知Borland的最后一个版本是1997,这意味着它不太可能支持这个功能虽然我找不到太多信息。如果您使用该工具的更现代的分支,它声称支持C99,因此可能有一种方法可以启用支持。

Xcode据我所知,可以clanggcc同时使用VLA模式中的c99gcc supports VLA as an extension非C99模式以及C ++和clang supports this as well in limited cases

如果你需要在两个编译器中进行开发,你可能不得不放弃VLA并使用替代方法来处理动态大小的数组,例如C中的malloc和C ++ std::vector可能是适合许多情况的正确选择。

答案 2 :(得分:2)

免责声明: 关于以下两个术语的差异,存在很多含糊不清:“声明”和“定义”。请注意我用来说明差异的例子,如果你碰巧解释歧义的方式不同于我。


为了完整起见:

声明一个可变长度数组(VLA)在C99中完全有效,正如您所做的那样:

int n;

scanf( "%d", &n );

int arr[ n ];

...问题可能在于您使用的编译器或您指定的标志。另一种方法是使用内存池并malloc一块足够大的内存块(n * sizeof( int )),然后free内存块完成后。

回到原始代码,非常重要来注意:只有声明一个可变长度数组才有效,定义一个不是。比如说,你想声明一个可变长度数组并对所有元素进行零填充。您可以不执行以下操作

int n;

scanf( "%d", &n );

int arr[ n ] = { 0 }; // Invalid.

...正如您所定义的arr。您需要执行以下操作:

int n;

scanf( "%d", &n );

int arr[ n ]; // Valid.

// Zero-fills the array.
for ( int i = 0; i < n; i++ ) {
  arr[ i ] = 0;
}

答案 3 :(得分:0)

<!-- language:C -->
/*maybe you can like this*/
int x;
int *p;
printf("Enter the number of value to be Entered:");
scanf("%d", &x);
p = (int *)malloc(sizeof(int) * x);

//p[0 - (x-1)] can be used