【问题标题】:Why does C++ compiler allows to create an array of unknown size on stack at compile time? [duplicate]为什么 C++ 编译器允许在编译时在堆栈上创建一个未知大小的数组? [复制]
【发布时间】:2018-04-16 17:12:36
【问题描述】:

我试图理解,在编译时在堆栈上创建一个未知大小的数组时会发生什么。让我们考虑这段代码:

int main()
{
    int x;
    cin >> x;

    int tab[x];
}

我发现了很多关于这个说你不能在堆栈上创建一个未知大小的数组的信息,但是我没有找到任何信息为什么 C++ 编译器允许它,或者其中一些允许它?创建这样的数组时会发生什么?它甚至是在堆栈上创建的还是已经在堆上?

GCC 编译器是否有一些选项可以打开,这样的构造会被视为错误或至少是警告?

【问题讨论】:

  • 1) VLA 是非标准 C++(如标准 C++ 不允许它们)。不过,一些编译器扩展使它们成为可能。 2)“为什么 C++ 编译器允许它”没有像 the C++ 编译器这样的东西。它有很多实现。
  • 变长数组
  • 古老的做法是在运行时声明数组时使用动态内存。现在,在 C++ 中,您应该改用 std::vector
  • 顺便说一句,它不称为“表”,而是数组,x 不是“未知”,它只是在编译时未知,但是一旦用户输入了一个数字,您就可以创建一个该大小的数组(如果你想写标准的c++,就不要这样)
  • 我不明白为什么这个问题会被否决。如果我不知道答案,我也不知道在哪里可以找到有关此的更多信息。严格来说,重复项也不是重复项。

标签: c++ gcc stack


【解决方案1】:

C++ 不允许可变长度数组 (VLA)。

但是,最新的 C 标准可以,因此有时可以找到它作为扩展,例如 GCC。

编译时,请确保明确选择一种语言(如果可以,选择 C++17 或更高版本)并要求具有迂腐(严格符合标准)的行为。

【讨论】:

  • 谢谢。现在我只能使用 C++1z,但它仍然允许 VLA,所以我必须使用这个编译器选项:(-Werror=vla)
  • 原来-pedantic-errors这个标志也可以用来代替-Werror=vla
猜你喜欢
  • 2011-05-19
  • 2013-07-07
  • 2021-07-31
  • 1970-01-01
  • 2019-01-02
  • 1970-01-01
  • 2021-04-06
相关资源
最近更新 更多