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

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);

额外的小优化建议

  1. 变量拼写:raw应该是row(表示“行”),虽然不影响功能,但规范的命名能让代码更易读。
  2. 循环结构:你用的嵌套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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 08:52:41