当我在this tutorial中阅读有关数组初始化的内容时。我发现了这张纸条。
type name [elements];
注意:方括号
[]
中的元素字段(表示数组中元素的数量)必须是常量表达式,因为数组是静态内存块,其大小必须在编译时确定,程序运行。*
据我所知,数组在运行时分配内存。这应该是假的?或者它意味着什么?
答案 0 :(得分:3)
请检查以下答案是否有助于您明确这一点。
Static array vs. dynamic array in C++
静态数组是在堆栈上创建的,并且必须具有固定的大小(需要知道堆栈的大小进入函数): int foo [10];
在堆上创建动态数组。它们可以有任何大小,但是你需要自己分配和释放它们,因为它们不属于堆栈框架: int * foo = new int [10]; 删除[] foo;
您不需要处理静态数组的内存管理,但是当它们结束的功能时它们会被破坏
Array size at run time without dynamic allocation is allowed?
C99标准(http://en.wikipedia.org/wiki/C99)支持堆栈上的可变大小的数组。一些编译器可能会实现这些标准并支持可变大小的数组。
答案 1 :(得分:1)
您可以使用:
int array[42];
但不是
int n;
std::cin >> n;
int array[n]; // Not standard C++
后者被某些编译器支持为VLA(可变长度数组)
的扩展答案 2 :(得分:1)
声明T a[N]
要求N
为converted constant expression。
转换常量表达式是隐式转换为的表达式 类型为T的prvalue,其中转换后的表达式是核心常量 表达。如果文字常量表达式具有类类型,则为 上下文隐式转换为预期的整数或未整形 具有constexpr用户定义转换函数的枚举类型。
诸如5
之类的int文字是prvalue,因此可以在声明T a[5]
中使用,但是在声明{{1}中不能使用左值,例如int n = 5
除非左值低于implicit lvalue-to-rvalue conversion左边的左值:
a)具有整数或枚举类型,是非易失性const,并且是 用常量表达式初始化,或者用这样的数组(包括 字符串文字)
b)具有文字类型并且引用用constexpr或其非可变子对象定义的非易失性对象
c)具有文字类型并且引用非易失性临时,用常量表达式初始化
因此以下内容有效:
T a[n]