【问题标题】:Array size determined at runtime运行时确定的数组大小
【发布时间】:2013-12-04 11:08:18
【问题描述】:

我看到一些这样的代码:

int foo()
{
  int sz = call_other_func();
  char array[sz];

  /* whatever */
}

我对它的工作原理感到困惑,甚至可以使用gcc 进行编译。数组的大小应该是 static 并且在编译时确定的,不是吗?

【问题讨论】:

标签: c arrays gcc variable-length-array


【解决方案1】:

这种类型的数组被称为variable length arrays(你也想raed:Arrays of Variable Length - GCC)并且只在C99中被允许。通过使用 VLA,可以在运行时确定数组的大小。

【讨论】:

  • 虽然人们对这个答案赞不绝口,但不知道为什么我的个人资料中没有添加声誉?
  • 看起来你是rep capped,恭喜。
  • @ShafikYaghmour;谢谢。但是许多用户在一天内获得了 275 甚至更多的声誉(我看到了这个),如何?
  • 我将提供的链接更改为更好的答案,因此您可能已经看到旧链接,元问题的答案是 You can still earn rep by winning a bounty, accepting an answer, or having one of your answers accepted, and downvotes will still count against you. 如果您此时没有花太多时间在元上你可能应该。
  • @ShafikYaghmour;我没有得到任何epic 或传奇徽章!我多次达到 +200,但声望从未超过 231。(我看到你也曾获得 261 声望)。
【解决方案2】:

“在编程中,可变长度数组(或 VLA)是一种自动存储持续时间的数组数据结构,其长度在运行时(而不是在编译时)确定。” (Wikipedia)

它们在 C99(以及随后在 C11)中受支持。

详细了解它的工作原理:The New C: Why Variable-length Arrays?

【讨论】:

    【解决方案3】:

    这是名为variable length arrays(VLA) 的有效 C99 功能,如果使用 gcc -std=c90 -pedantic 编译,您将收到以下警告:

    警告:ISO C90 禁止变长数组'array' [-Wvla]

    使用-std=c99 -pedantic 不会产生警告,尽管gccclangC99 模式之外支持VLA 并且在C++ 不允许将 VLA 作为extension

    我们可以从C99 draft standard 部分看到6.7.5.2 数组声明符 段落4 说(强调我的):

    如果大小不存在,则数组类型是不完整类型。如果大小是 * 而不是表达式,则数组类型是未指定大小的可变长度数组类型,只能在具有函数原型范围的声明中使用;124) 这样的数组仍然是完整类型。如果大小是整数常量表达式,并且元素类型具有已知的常量大小,则数组类型不是变长数组类型; 否则,数组类型为变长数组类型。

    请注意Visual Studio does not support VLA,即使他们now support C99

    【讨论】:

      猜你喜欢
      • 2015-11-19
      • 1970-01-01
      • 2017-05-23
      • 2010-12-13
      • 2020-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多