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

C++传递可变尺寸多维数组已传维度仍编译报错求助

报错原因

  • 第一:你使用的变长数组(VLA) 不属于C标准特性。int dp[n + 1][2][3]中n是运行时变量,这是C99的语法,仅部分编译器(如GCC)通过扩展支持,这类变长数组的类型无法和函数参数中声明的int dp[N][M][K]匹配——C要求函数形参数组的除首维外的所有维度必须是编译期常量,你将M、K作为运行时参数传递,编译器无法推导匹配的类型。
  • 第二:你代码存在隐藏逻辑问题:helper函数声明返回int类型,但if(idx == N) return;没有返回任何值,会触发未定义行为。

解决方案

方案1:使用C++标准容器vector(最推荐,全编译器兼容)

直接把三维数组替换为vector,不需要手动传递维度,也完全符合C++标准,修改后的代码如下:

class Solution {
public:
    int mod = 1e9 + 7;
    int checkRecord(int n) {
        // 初始化三维vector,所有元素默认-1
        vector<vector<vector<int>>> dp(n + 1, vector<vector<int>>(2, vector<int>(3, -1)));
        return helper(0, 1, 2, dp);
    }
    // dp传引用避免拷贝开销
    int helper(int idx, int A, int startL, vector<vector<vector<int>>>& dp) {
        if(idx == dp.size()) return 1; // 补充合法返回值
    
        if(dp[idx][A][startL] != -1) {
            return dp[idx][A][startL];
        }
        
        long long res = helper(idx + 1, A, 2, dp) % mod;
        
        if(startL > 0) {
            res = (res + helper(idx + 1, A, startL - 1, dp)) % mod;
        }
        // 用long long中间变量避免加法溢出
        return dp[idx][A][startL] = res;
    }
};

方案2:利用固定维度优化(适配支持VLA的编译器)

你的后两维是固定的常量2、3,不需要作为运行时参数传递,直接写死在函数参数的数组声明里即可解决类型匹配问题:

class Solution {
public:
    int mod = 1e9 + 7;
    int checkRecord(int n) {
        int dp[n + 1][2][3];
        memset(dp, -1, sizeof(dp));
        return helper(0, 1, 2, n + 1, dp);
    }
    // 后两维写死为编译期常量,仅传第一维长度N即可
    int helper(int idx, int A, int startL, int N, int dp[][2][3]) {
        if(idx == N) return 1; // 补充返回值
    
        if(dp[idx][A][startL] != -1) {
            return dp[idx][A][startL];
        }
        
        long long res = helper(idx + 1, A, 2, N, dp) % mod;
        
        if(startL > 0) {
            res = (res + helper(idx + 1, A, startL - 1, N, dp)) % mod;
        }
        return dp[idx][A][startL] = res;
    }
};

注意该方案仅在支持C99 VLA扩展的编译器下可用,不具备全平台兼容性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 01:45:03