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

Are arrays not dynamically allocated in C++?

本文关键字:动态分配 C++ 数组      更新时间:2023-10-16

我刚刚读了一个关于动态内存的教程,它C++如下:

。正则数组的大小需要是一个常量表达式,因此它的大小必须在设计程序的那一刻确定,在它运行之前......

但是,我刚刚运行了一个程序来测试这一点:

#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;
}

。而且没有错误。那么教程的陈述是不正确的还是我误解了它?

不,他们不是。

你在这里看到的是一个叫做"可变长度数组"的GNU扩展(它仍然是基于堆栈的)。

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

如果你使用了正确的编译标志(-Wall -Wextra -pedantic),那么你的编译器会告诉你这一点。

您的程序C++不合法。您正在使用的编译器具有一个扩展,允许您使用非常量表达式作为数组大小。以下是我的编译器对此的看法:

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
         ^

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

正如其他人已经说过的那样,您的编译器正在为此使用扩展。当像这样声明数组时 ->

int arr[100];

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

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

动态数组是使用堆分配的。

您使用

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

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

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

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

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

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