我刚刚在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;
}
......并且没有错误。那么教程所做的陈述是错误的还是我误解了它?
答案 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定义。