1

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

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

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

需要常量表达式

为什么会发生这种情况?我该如何解决?

4

4 回答 4

3
int array[x];

x不是编译时间常数,编译器抱怨它。可变长度数组是 C99 标准的一部分。看起来您的编译器不符合标准。

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

于 2013-08-14T02:29:31.600 回答
3

本声明:

int array[x];

是一个可变长度数组(VLA,它是一个C99特征。不VLA支持数组大小必须是编译时常量。这DrDobb's articleVLA一个很好的参考。

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

Xcode据我了解,可以在模式、非 C99 模式和 C++中使用其中一种clanggcc两种支持VLAc99gcc supports VLA as an extensionclang supports this as well in limited cases

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

于 2013-08-14T03:13:42.867 回答
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;
}
于 2013-08-14T02:44:26.893 回答
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
于 2013-08-14T03:36:26.747 回答