C++11二维数组初始化疑问:非常量变量的使用困惑
C++动态数组初始化的疑问解答
代码片段
int main() { const int n= 20; int m; m = n+10; int (*a)[m] = new int [n][m]; //1 int *w = new int [m]; //2 int (*b)[n] = new int [m][n]; //3 int (*d)[n] = new int [n][n]; //4 }
编译错误
error: array size in new-expression must be constant error: the value of 'm' is not usable in a constant expression note: 'int m' is not const
疑问解答
为何一维数组(2)可使用非常量变量m初始化?
C++11及以后的标准允许动态内存分配时,用运行时确定的表达式作为数组大小。new int[m]是动态分配一维数组,它在堆上开辟能容纳m个int的连续内存,返回指向首元素的int*指针——这个操作不涉及编译期固定大小的数组类型,仅需运行时确定分配的字节数,因此不需要m是编译期常量。为何二维数组(3)的行数位置可使用非常量变量m?
new int[m][n]的本质是动态分配m个固定大小的数组对象,每个对象是int[n]类型(n是编译期常量,int[n]的大小在编译期确定)。这里的m是动态分配的元素数量,和一维动态分配new T[m](T为固定大小类型)的逻辑一致,返回指向int[n]的指针int (*b)[n],该指针的类型大小在编译期可确定(每个指向的元素占n*sizeof(int)字节),因此允许用运行时的m作为行数。为何二维数组(1)的列数位置不能使用非常量变量m?
new int[n][m]中的第二个维度m是运行时变量,意味着每个子数组是int[m]类型——这是C标准不支持的变长数组(VLA)类型。同时,int (*a)[m]这个指针类型的大小依赖于m的运行时值(指针指向的元素大小是m*sizeof(int)),但C要求所有类型的大小必须在编译期确定,因此编译器会报错。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

