C语言中传递二维数组至函数时出现异常行为
问题分析与解决方案
嘿,我一眼就揪出了导致你结果数组第一行被“克隆”到第二行的核心问题——你的print函数参数顺序完全搞反了!
为什么会出现这种诡异的错误?
在C语言里,传递二维数组给函数时,编译器必须提前知道数组的第二维(列数)大小,才能正确计算每一行在内存中的起始地址。你现在的print函数定义是这样的:
void print(int result[][col2], int raw1, int col2){
这里col2是最后一个参数,编译器解析result[][col2]的时候,根本还不知道col2的值是多少,没法正确计算数组的内存偏移量。这就导致在print函数里访问数组时,内存地址计算出错,把第一行的内容错误映射到了第二行的位置上。
修复方案
把print函数的参数顺序调整一下,先传递列数col2,再传递二维数组,让编译器提前拿到列数信息,就能正确解析数组了:
// 修正后的print函数 void print(int raw1, int col2, int result[][col2]){ int i,j; for(i = 0; i < raw1; i++){ for(j = 0; j < col2; j++){ printf("%i, ", result[i][j]); } printf("\n"); } }
同时在product函数里调用print时,也要对应调整参数顺序:
// 调用修正后的print函数 print(raw1, col2, result);
额外的小优化建议
- 变量拼写:
raw应该是row(表示“行”),虽然不影响功能,但规范的命名能让代码更易读。 - 循环结构:你用的嵌套
do-while循环可以换成更直观的for循环,比如矩阵乘法的标准写法:
// 替换原来的do-while循环,逻辑更清晰,不易出错 for(i = 0; i < raw1; i++){ for(l = 0; l < col2; l++){ int element = 0; for(j = 0; j < col1; j++){ element += matrix1[i][j] * matrix2[j][l]; } result[i][l] = element; } }
内容的提问来源于stack exchange,提问作者Giuseppe
相关产品推荐
相关产品推荐

