【问题标题】:Trying to assign a variable as the length of an array in C尝试将变量分配为C中数组的长度
【发布时间】:2013-08-14 02:27:33
【问题描述】:

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

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

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

需要常量表达式

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

【问题讨论】:

  • 这是c99 的一个功能,gccclang 都支持它作为非 c99 模式的扩展,但 Visual Studio 不支持 c99,因此视觉中没有可变长度数组工作室。你用的是视觉工作室吗?您能否提供有关您正在使用的编译器的更多详细信息?

标签: c arrays variables declaration


【解决方案1】:
int array[x];

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

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

【讨论】:

  • 错了,你可以在 C99 中这样做,只要你只是声明你的变量——它不能被定义(初始化)。
  • @JacobPollack 是的。到我写编辑的时候,你发表了评论。
  • +1 进行修复。我仍然认为向 OP(和其他人)提及这个数组不能定义,只能声明是有用的。
  • 我不明白你的声明术语,在这种情况下的定义。
  • @JacobPollack 没有必要初始化一个变量来定义它。例如-int a; 既是定义又是声明,但仅在某些情况下,定义和声明与 extern 变量的情况不同:)
【解决方案2】:

此声明:

int array[x];

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

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

Xcode 据我了解可以使用clanggcc,两者都支持c99 模式下的VLA,非C99 模式下的gcc supports VLA as an extension 以及C++ 和clang supports this as well in limited cases

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

【讨论】:

  • +1 用于根据他的特定环境定制您的响应。没看到他提过,该死的通知。
【解决方案3】:

免责声明: 关于以下两个术语的区别存在很多歧义:“声明”和“定义”。如果您碰巧对歧义的解释与我不同,请注意我用来说明差异的示例。


为了完整起见:

声明可变长度数组 (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;
}

【讨论】:

  • 定义变长数组有效。标准不支持初始化它。这个答案对术语感到困惑。声明描述了一个标识符。定义(针对对象)也会导致为对象保留空间。初始化设置值。
【解决方案4】:
<!-- 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

【讨论】:

  • -1 有很多原因,包括:已经提到(您的答案是质量较差的答案和其他答案的子集)并且您有一个不好的例子(不要投malloc)。
猜你喜欢
  • 2018-05-02
  • 2016-07-29
  • 1970-01-01
  • 2014-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-13
  • 1970-01-01
相关资源
最近更新 更多