You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

疑问解答

  1. 为何一维数组(2)可使用非常量变量m初始化?
    C++11及以后的标准允许动态内存分配时,用运行时确定的表达式作为数组大小。new int[m]是动态分配一维数组,它在堆上开辟能容纳m个int的连续内存,返回指向首元素的int*指针——这个操作不涉及编译期固定大小的数组类型,仅需运行时确定分配的字节数,因此不需要m是编译期常量。

  2. 为何二维数组(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作为行数。

  3. 为何二维数组(1)的列数位置不能使用非常量变量m?
    new int[n][m]中的第二个维度m是运行时变量,意味着每个子数组是int[m]类型——这是C标准不支持的变长数组(VLA)类型。同时,int (*a)[m]这个指针类型的大小依赖于m的运行时值(指针指向的元素大小是m*sizeof(int)),但C要求所有类型的大小必须在编译期确定,因此编译器会报错。


内容的提问来源于stack exchange,提问作者Ivan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 17:35:17