C语言传递三维数组至函数时遇编译错误,求解决方案
解决C语言函数参数中变长数组的编译错误
错误根源
你遇到的编译错误核心有两个:
- 代码使用了**C99变长数组(VLA)**特性,但你的文件后缀是
.cpp,编译器会按C标准处理——而C标准并不支持变长数组(部分编译器的扩展支持默认可能关闭)。 - 你的
count_gen函数声明返回size_t类型,但函数体中没有return语句,这会导致未定义行为,后续必须修复。
解决办法
方法1:改用C语言编译
这是适配你当前代码的最简单方案:
- 将文件后缀从
.cpp改为.c。 - 使用C编译器(如
gcc)编译,GCC默认支持C99的变长数组特性,编译命令示例:gcc your_file.c -o your_program。 - 在
count_gen函数末尾补充返回值,比如return 0;(或返回你需要的统计结果)。
方法2:修改代码适配C++(移除变长数组)
如果必须用C++编译,需要用动态内存分配替代变长数组,具体步骤如下:
1. 调整函数参数为指针形式
修改count_gen函数,用指针传递数组,保留维度参数:
size_t count_gen(const size_t rowbound, const size_t colbound, const int num, double (*input)[4][rowbound][colbound], size_t (*output)[rowbound][colbound]) { size_t i,j,row; size_t total = 0; // 可选:统计总计数 for(j = 0; j < colbound; ++j) { for(i = 0; i < rowbound; ++i) { for(row = 0; row < rowbound; ++row) { if(row == i) continue; else if((*input)[num][i][j] >= (*input)[num][row][j]) { (*output)[i][j] += 1; total++; } } } } return total; // 补充返回值 }
2. 动态分配数组并调用函数
在main函数中,用new创建动态数组,调用函数时转换指针类型:
int main(void) { size_t i,j,m,n; printf("Enter the number of parameters: "); scanf("%zu",&m); printf("Enter the number of objects: "); scanf("%zu",&n); // 动态分配三维数组:4 * n * m double*** SVNSFSS = new double**[4]; for(int x = 0; x < 4; x++){ SVNSFSS[x] = new double*[n]; for(size_t y = 0; y < n; y++){ SVNSFSS[x][y] = new double[m](); // 初始化为0 } } // 动态分配二维数组:n * m size_t** counts1 = new size_t*[n]; for(size_t y = 0; y < n; y++){ counts1[y] = new size_t[m](); // 初始化为0 } // 调用函数,转换指针类型匹配参数 count_gen(n, m, 0, reinterpret_cast<double(*)[4][n][m]>(SVNSFSS), reinterpret_cast<size_t(*)[n][m]>(counts1)); // 释放动态分配的内存,避免泄漏 for(int x = 0; x < 4; x++){ for(size_t y = 0; y < n; y++){ delete[] SVNSFSS[x][y]; } delete[] SVNSFSS[x]; } delete[] SVNSFSS; for(size_t y = 0; y < n; y++){ delete[] counts1[y]; } delete[] counts1; return 0; }
内容的提问来源于stack exchange,提问作者Usual_Learner
相关产品推荐
相关产品推荐

