【问题标题】:C++: Why does int array[size] work?C++:为什么 int array[size] 有效?
【发布时间】:2013-07-30 14:53:56
【问题描述】:

我已经开始学习 c++。我读到数组的大小只能在运行之前设置,而动态数组可以在运行时设置。所以我期待这会失败,但它没有:

#include <iostream>

int main() {
    using namespace std;
    int size;
    cout << "enter array size:";
    cin >> size;
    int i, score[size], max; //array size set to variable doesn't fail
    cout << endl << "enter scores:\n";
    cin >> score[0];
    max = score[0];
    for (i = 1; i < size; i++)
    {
        cin >> score[i];
        if (score[i] > max)
    max = score[i];
    }
    cout << "the highest score is " << max << endl;
    return 0;
}

这是最近 C++ 编译器的新特性吗?是否意识到我需要一个动态数组并创建它?

【问题讨论】:

  • 这是一个非标准异常。只是不要。
  • @LuchianGrigore 所以只有一些编译器支持它。因此应该忽略。感谢您的帮助
  • @Ashley 我已经看到它在 GCC 中工作,但可能不适用于 Visual Studio。这不是一个标准。
  • 如果您使用的是 GCC,请使用 -pedantic-errors 编译您的代码,然后面对编译器的愤怒。
  • @Nawaz "error: ISO C++ forbids variable-size array'score'" 很棒的提示!非常感谢初学者

标签: c++ arrays dynamic automation


【解决方案1】:

您可能正在使用 GCC 编译器,它有一个名为 Arrays of Variable Length 的扩展名。

std::vector 是 C++ 中真正的动态数组。

要在 GCC 中选择此标准,请使用选项 -std=c++11;要获得标准所需的所有诊断信息,您还应该指定 -pedantic(或 -pedantic-errors,如果您希望它们是错误而不是警告)。

【讨论】:

  • 如果您使用 gcc 并且不希望允许这样做,我建议使用 -pedantic-errors 命令行标志。
【解决方案2】:

在所有当前和过去的标准中,该代码格式不正确。可变长度数组是 C99 功能而不是 C++ 功能,尽管一些编译器确实将其作为扩展提供。在即将发布的标准(预计是 C++14,目前正在审查中)中,采用了其他名称的类似功能(语义略有不同),因此预计将来会成为标准。

请注意,一般情况下,即排除 运行时绑定的数组(因为它们在即将发布的标准中命名),数组的大小是对象的静态类型的一部分并且已知在编译时。对于 VLA 或 运行时绑定数组,大小在编译时是未知的,因此类型在某种程度上是类型中的第二类公民。这意味着您不能将 VLA/ARB 与模板一起使用(因为模板的代码生成取决于类型,其中包括大小,这在编译时是未知的)。

同理还有其他限制,sizeof不是VLA的编译时操作,甚至ARB也不允许,这些形式的数组只能用于自动存储时长的对象(即在栈),你不能取数组的地址(虽然你可以取第一个成员的地址),...

另一个需要考虑的重点是,该标准不保证 ARB 的内存将在堆栈上分配,并允许实现调用全局分配函数,尽管目的是编译器会赶上并提供堆栈中的空间。

【讨论】:

    【解决方案3】:

    小心!未定义的整数根本不保证是任何值。一些编译器将默认为 0,而其他编译器将使用内存中已经存在的任何垃圾位。出于这个原因,Visual Studio 甚至不让我编译。在设置 size 变量之前,单步执行代码以查看为 score 分配的内存。可能在编译时 size 是来自垃圾内存的随机整数,这意味着它可以在每次执行时更改!

    C 风格的数组需要知道要分配多少连续内存。这允许直接索引和其他优化。正如其他人所建议的那样,std::vector 是 C++ 中的标准动态容器,它在底层使用数组。

    【讨论】:

    • (忽略非标准数组[大小] 初始化) 为了安全起见,我应该始终定义一个变量来避免垃圾值。 int size = 0; 而不是依赖cin &gt;&gt; size;
    • btw Visual Studio 允许您使用未初始化的值,但会发出警告
    • 在调试模式下,Visual Studio 默认将所有未初始化的值设置为 0。它不允许创建大小为 0 的数组。错误 C2057、C2466 和 C2133。
    猜你喜欢
    • 1970-01-01
    • 2014-12-24
    • 2015-11-04
    • 2010-11-05
    • 2016-08-06
    • 1970-01-01
    • 2022-01-02
    相关资源
    最近更新 更多