数组是不是在C ++中动态分配的?

时间:2015-06-14 18:50:21

标签: c++ arrays

我刚刚在C ++中阅读tutorial about dynamic memory,其内容如下:

  

...常规数组的大小需要是一个常量表达式,因此它的大小必须在设计程序之前确定,然后再运行...

但是,我只是运行了一个程序来测试它:

#include <cstdlib>
#include <iostream>

using namespace std;

int main() {
    int y;
    cout << "Enter number of elements of array: ";
    cin >> y;
    int x[y];   // I declared an array using a variable size instead of a constant expression
    x[y-1] = 3;
    cout << x[y-1];

    return 0;
}

......并且没有错误。那么教程所做的陈述是错误的还是我误解了它?

4 个答案:

答案 0 :(得分:3)

不,他们不是。

您在此处看到的是a GNU extension called "variable length arrays"(仍然是基于堆栈的)。

引用在实际C ++语言本身的上下文中是正确的。

如果您使用了正确的编译标记(-Wall -Wextra -pedantic),那么your compiler would tell you this

答案 1 :(得分:2)

您的程序不是合法的C ++。您使用的编译器具有扩展,允许您将非常量表达式用作数组大小。这是我的编译器has to say关于它的内容:

main.cpp:10:10: warning: variable length arrays are a C99 feature [-Wvla-extension]
    int x[y];   // I declared an array using a variable size instead of a constant expression
         ^

此外,这与动态分配无关:您的数组仍然存储在堆栈中,就像任何其他自动分配的对象一样。

答案 2 :(得分:0)

正如其他人已经说明你的编译器正在使用扩展名。 声明这样的数组时 - &gt;

int arr[100];

C ++在堆栈上分配它。要在c ++中创建动态数组,必须按以下方式声明它:

int *arr;
arr = new int[n];

使用堆分配动态数组。

答案 3 :(得分:-3)

您使用的编译器具有自己的语言扩展名,但不符合C ++标准。 C ++不允许在程序中使用可变长度数组但是C允许定义这样的数组。因此,一些C ++编译器在C ++语法中包含了C标准的这一特性。

在C ++中,数组的声明符按以下方式定义

noptr-declarator [ constant-expressionopt ] attribute-specifier-seqopt

而在C语言中,它是根据以下语法规则定义的

direct-declarator [type-qualifier-listopt assignment-expressionopt ]

因此,编译器的语言扩展使用数组声明符的定义,类似于数组声明符的C定义。