【问题标题】:dynamic array declaration in different ways不同方式的动态数组声明
【发布时间】:2013-02-25 04:34:54
【问题描述】:

我知道int* array = new int [n]; 在堆中分配内存空间。

但是,如果我在代码块中声明这样的内容:int array[n];,它将成功编译,但如果我将其移至 Visual Studio,则会出现错误。

我想问的是:

  1. int[n] 的真正作用是什么?它与堆分配相比如何?它们有什么区别?

  2. 如果我使用int array[n] 而不是int* array = new int [n];,会出现什么错误?

【问题讨论】:

  • 可变长度不应用于静态大小的数组。 Codeblocks 接受它是因为 GCC 可能支持它作为扩展。
  • 取自 GCC 文档:Variable-length automatic arrays are allowed in ISO C99, and as an extension GCC accepts them in C90 mode and in C++.

标签: c++ arrays heap-memory


【解决方案1】:

GCC 在 C++ 中有一个扩展,允许 int array[n] 其中n 不是编译时间常数值。在这种情况下,标准语言不允许您对 n 使用非常量值(在 C99 中是允许的)。

【讨论】:

    【解决方案2】:

    int array[n] 在栈上声明一个数组,而不是在堆上。在标准 C++ 中,n 必须是编译时间常数,但是一些编译器有一个扩展,允许以这种形式声明的可变长度数组没有编译时间常数 n。它不是标准的,可能不应该使用。

    int array[n] 可能会导致 int* array = new int [n]; 出现一些问题:

    • 如果n 足够大,可能会导致堆栈溢出。或者,如果该数组是类成员,并且您创建了该类的大型数组。
    • 如果array 是一个类成员移动可能和复制一样昂贵
    • 如果array 是一个类成员并且您已经给出了指向数组和move 类的指针,那么这些指针现在指向一个移动后的对象,或者如果该对象也被破坏了,则指向随机内存。无论哪种方式,都不好。

    【讨论】:

    • 那么当我使用int array[n]时会出现什么潜在的问题吗?
    • 那为什么有些编译器会为它做扩展呢?谢谢
    • @Liang-YuPan Problems with Arrays
    • @Liang-YuPan 因为它在 C99 标准中(C++ 与 C 标准有很多共同点),而且很方便。但它不在 C++ 标准中
    • @Liang-YuPan 或许你应该接受这个答案,如果它有帮助的话。
    【解决方案3】:

    如果我能正确理解您的问题,那么我可以回答这两个问题。

    1. int array[10] 分配在堆栈上,而int *array = new int[10] 分配在堆上。通常,堆栈数组只能处理恒定数量的元素,因此 C90 中不允许使用 int array[n](只要 n 不是恒定的)。

    2. MinGW(这是代码块在 Windows 上使用的 GCC 编译器的版本)有一个扩展名,它允许您在 C90 模式下编写 int array[n],其中 n 不是常量。 Visual C++ 不允许这样做。

    【讨论】:

      【解决方案4】:

      当您编写int array[n] 时,这意味着您正在执行静态分配。即内存将在编译时分配。所以这里使用变长会导致编译时出错。

      【讨论】:

        猜你喜欢
        • 2013-06-21
        • 2023-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-07
        • 2019-12-16
        • 2016-02-01
        相关资源
        最近更新 更多