数组不是在C++中动态分配的
Are arrays not dynamically allocated in C++?
我刚刚读了一个关于动态内存的教程,它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 定义。
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 在c++中使用动态分配的问题
- 使用递归模板动态分配的多维数组
- 对具有动态分配的内存和析构函数的类对象的引用
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 访问动态分配列表中的元素
- 为什么 std::equal_to会导致动态分配?
- 调用析构函数以释放动态分配的内存
- 动态分配Q_Property变量
- 在 C++ 中搜索动态分配的数组中的出现次数
- 动态分配的聊天数组打印缺失的数据和空
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 使用动态分配将 char* 复制到另一个字符**
- 使用指针在存在特征库的情况下动态分配 c++ 中的矩阵
- 二维阵列的动态分配
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 在运行时为动态分配的内存输入值
- 释放动态分配的内存时是否需要执行此额外步骤
- 动态分配字符数组的内存