我试图从用户那里获取 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
两种支持VLA
c99
gcc supports VLA as an extension
clang 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