是否在编译时确定了数组的大小?

时间:2014-10-03 08:43:41

标签: c++ arrays

当我在this tutorial中阅读有关数组初始化的内容时。我发现了这张纸条。

type name [elements];
  

注意:方括号[]中的元素字段(表示数组中元素的数量)必须是常量表达式,因为数组是静态内存块,其大小必须在编译时确定,程序运行。*

据我所知,数组在运行时分配内存。这应该是假的?或者它意味着什么?

3 个答案:

答案 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]要求Nconverted 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]