我试图从用户那里获取 n 个特定数量的值,为此我采取了简单的方法,并要求用户输入要输入的特定数量的值。这个数量的值保存在一个变量中,例如“ x ”:
int x;
printf("Enter the number of values to be entered: ");
scanf("%d", &x);
int array[x];
因此,当我尝试运行代码时,我收到以下消息:
需要常量表达式
为什么会发生这种情况?我该如何解决?
我试图从用户那里获取 n 个特定数量的值,为此我采取了简单的方法,并要求用户输入要输入的特定数量的值。这个数量的值保存在一个变量中,例如“ x ”:
int x;
printf("Enter the number of values to be entered: ");
scanf("%d", &x);
int array[x];
因此,当我尝试运行代码时,我收到以下消息:
需要常量表达式
为什么会发生这种情况?我该如何解决?
int array[x];
x不是编译时间常数,编译器抱怨它。可变长度数组是 C99 标准的一部分。看起来您的编译器不符合标准。
您可以使用它malloc来动态分配数组,然后再分配free它。或者使用支持 VLA 的编译器。
本声明:
int array[x];
是一个可变长度数组(VLA),它是一个C99特征。不VLA支持数组大小必须是编译时常量。这DrDobb's article是VLA一个很好的参考。
您提到您同时使用Borland C++和Xcode,据我所知Borland,上一个版本是1997 年,这意味着它不太可能支持此功能,尽管我找不到太多信息。如果您使用的是该工具的更现代的分支,它声称支持 C99,因此可能有一种启用支持的方法。
Xcode据我了解,可以在模式、非 C99 模式和 C++中使用其中一种clang或gcc两种支持VLAc99gcc supports VLA as an extensionclang supports this as well in limited cases
如果您需要在两种编译器中进行开发,您可能不得不放弃VLA并使用另一种方法来处理动态大小的数组,例如malloc在 C 和 C++std::vector中,这可能是许多情况下的正确选择。
免责声明: 对于以下两个术语的区别存在很多歧义:“声明”和“定义”。如果您碰巧对歧义的解释与我不同,请注意我用来说明差异的示例。
为了完整起见:
正如您所做的那样,声明可变长度数组 ( 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;
}
<!-- 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