繁体   English   中英

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

[英]Is the size of an array determined at compile time?

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

type name [elements];

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

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

请检查以下答案是否有助于使您对此有所了解。

C ++中的静态数组与动态数组

静态数组是在堆栈上创建的,并且必须具有固定的大小(在函数中需要知道堆栈的大小):int foo [10];

动态数组是在堆上创建的。 它们可以有任意大小,但是由于它们不属于堆栈框架,因此您需要自己分配和释放它们:int * foo = new int [10]; 删除[] foo;

您不需要处理静态数组的内存管理,但是当函数结束时它们会被销毁

允许运行时没有动态分配的数组大小?

C99标准( http://en.wikipedia.org/wiki/C99 )支持堆栈上的可变大小的数组。 一些编译器可能会实现这些标准并支持可变大小的数组。

声明T a[N]要求N转换后的常数表达式

转换常量表达式是隐式转换为类型T的prvalue的表达式,其中转换后的表达式是核心常量表达式。 如果文字常量表达式具有类类型,则使用constexpr用户定义的转换函数将其上下文隐式转换为预期的整数或无范围的枚举类型。

诸如5类的int文字是prvalue,因此可以在声明T a[5] ,但是在声明T a[n]不能使用int n = 5这样的左值,除非左值在-进行隐含的左值到右值转换 ,其中左值:

a)具有整数或枚举类型,是非易失性const,并使用常量表达式或此类数组(包括字符串文字)进行初始化

b)具有文字类型并且引用用constexpr或其非可变子对象定义的非易失性对象

c)具有文字类型并且引用非易失性临时,用常量表达式初始化

因此以下内容有效:

const int n = 5; 
int a[n]; 
constexpr int n = 5; 
int a[n];

你可以使用:

int array[42];

但不是

int n;
std::cin >> n;
int array[n]; // Not standard C++

后者被某些编译器支持作为VLA(可变长度数组)的扩展

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM