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
相关产品推荐
相关产品推荐

