允许运行时没有动态分配的数组大小?

sya*_*yaz 58 c c++ array-initialization

我已经使用C++几年了,今天我看到了一些代码,但这怎么能完全合法呢?

int main(int argc, char **argv)
{
    size_t size;
    cin >> size;
    int array[size];
    for(size_t i = 0; i < size; i++)
    {
        array[i] = i;
        cout << i << endl;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

根据海湾合作委员会编制.

如何在没有new或没有运行时确定大小malloc

只是为了仔细检查,我用谷歌搜索了一些和我的所有类似的代码声称存储大小错误.

甚至Deitel的C++如何编程p.共同编程错误4.5下的261个状态:

只有常量可用于声明自动和静态数组的大小.

给我看.

Meh*_*ari 53

这在C99中有效.

C99标准支持堆栈上的可变大小的数组.可能你的编译器也选择支持这个构造.

请注意,这与malloc和不同new.gcc在堆栈上分配数组int array[100],就像调整堆栈指针一样.没有完成堆分配.这非常像_alloca.

  • 我在几个月前编写的代码库中的文件中遇到了同样的情况.我和团队的其他成员一样感到困惑,为什么要编译.在我们的情况下,在声明数组之前计算了数组的大小(也不应该允许这样做?)无论如何,挑战已经消失了.任何能够回答为什么这是合法的人都会得到一个流行音乐.如果你曾经在西雅图,请告诉我.我有一个流行蛋挞给你. (12认同)
  • 在这种情况下,您能否提供有关堆栈内部工作原理的一些信息/链接?这会在运行时引入一些开销吗? (2认同)
  • @balki开销很小,因为它基本上是递增/递减堆栈指针.如果将原始堆栈指针保存在函数的开头,则堆栈行为可以与正常情况基本相同. (2认同)

jpa*_*cek 20

这称为VLA(可变长度阵列).它在c99中是标准的,但是gcc允许它在c ++代码中作为扩展.如果你想让它拒绝代码,尝试尝试-std=standard,-ansi-pedantic选项.

  • `-std` 和 `-ansi` 选项与此扩展完全无关。 (2认同)

Özg*_*gür 7

它仅在C99 有效.下次您可以尝试在可靠的编译器中检查代码.


小智 6

它是有效的 C99,它不是有效的 C++。这是两种语言之间的众多差异之一。

  • 它永远不会包含在 c++1x 中:D,但我们希望 dynarray&lt;T&gt; 能够加入。我会喜欢它。所以你可以做 dynarray&lt;int&gt; a(some_size); 并让它有效地分配,可能使用编译器 hax,如 _alloca 等。 (3认同)
  • 对于未来的任何人:它将包含在 C++14 中(具有较小的功能集,例如“typedef”、sizeof() 等)。 (3认同)
  • 我猜 C++0x 会支持它 (2认同)
  • @RedXIII:猜错了。VLA 和“dynarray”都不是 C++14 的一部分。 (2认同)