我正在尝试从用户那里获取n个特定数量的值,为此,我采用了简单的方法,并要求用户输入要输入的特定数量的值。 此数量的值保存在变量中,例如“ x ”:
int x;
printf("Enter the number of values to be entered: ");
scanf("%d", &x);
int array[x];
因此,当我尝试运行代码时,我收到以下消息:
需要常量表达式
为什么会这样?我怎么能解决它?
答案 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
据我所知,可以clang
或gcc
同时使用VLA
模式中的c99
,gcc 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