【问题标题】:Array of size defined by not constant variable由非常量变量定义的大小数组
【发布时间】:2011-11-14 17:49:20
【问题描述】:

有这样的代码:

#include <iostream>

int main()
{
  int size;
  std::cin >> size;

  size = size + 1;
  int tab3[size];

  tab3[0] = 5;
  std::cout << tab3[0] << " " << sizeof(tab3) << std::endl;
  return 0;
}

结果是:

$ g++ prog.cpp -o prog -Wall -W 
$ ./prog
5
5 24

为什么这段代码甚至可以编译?数组的长度不应该是一个常量变量吗?

我使用的是 g++ 版本 4.4.5。

【问题讨论】:

    标签: c++ arrays


    【解决方案1】:

    C++ 中的可变长度数组可作为 GCC 中的扩展使用。编译时包含所有警告应该提醒您注意这一事实(包括-pedantic)。

    【讨论】:

    • +1,虽然我不知道sizeof() 也可以是非常数。如果我曾经想过在上面使用sizeof(),我预计它会因某种原因而失败。
    • @MichaelKrelin-hacker:同样,作为扩展... VLA 需要运行时sizeof(),因此它是 C99 标准的一部分。这不是一个非常 C++ 类型的东西。想想decltype 和所有这些......
    • 有趣的是,似乎不存在在堆栈上分配内存的任何标准化方法。我们可以使用placement-new 处理对象构造,但在C++ 中不可能在堆栈上获得可变数量的原始内存。
    • 当然,我不怀疑这是一个标准,只是我不知道,也从未想过。可能alloca() 没有标准化,但它很常见,不是吗?
    • 曾有人提议在 C++ 中考虑 VLA,但标准委员会放弃了它,因为他们认为对类型系统的修改以支持其远远超过了他们提供的灵活性。
    【解决方案2】:

    它是 C99 功能,不是 C++ 的一部分。它们通常被称为 VLA(可变长度数组)。

    如果您使用-pedantic 运行g++,它将被拒绝。

    请参阅GCC docs 了解更多信息。

    另请参阅:VLAs are evil

    【讨论】:

      【解决方案3】:

      GCC 提供 VLA 或可变长度数组。更好的做法是创建一个指针并使用new 关键字来分配空间。 VLA 在 MSVC 中不可用,因此第二个选项更适合跨平台代码

      【讨论】:

        猜你喜欢
        • 2011-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-28
        • 2015-10-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多