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

C语言循环完成后矩阵乘法结果全零问题求助

解决矩阵乘法后结果全零的问题

从你描述的问题(循环过程中数值非零,但最终乘积矩阵全为零)和给出的代码片段来看,最可能的根源是乘积矩阵的内存分配不完整,我来帮你拆解问题并给出修正方案:

核心问题分析

你已经分配了存储行指针的数组:

int** product = (int**) malloc(m1 * sizeof(int*));

但这里只创建了m1个指向int数组的指针,并没有为每个指针分配对应的列内存!这意味着product[i][j]指向的是未初始化的非法内存地址——你在循环中计算的sum值可能写到了无效区域,最后读取的时候自然会得到全零(或随机垃圾值,只是刚好表现为全零)。

另外,就算分配了行内存,也建议先将元素初始化为0,避免计算前的垃圾值干扰结果。

修正后的完整代码

int** multiply_matrices(int** matrix1, int** matrix2, int m1, int n1, int m2, int n2) {
    // 先检查矩阵维度是否合法
    if(n1 != m2) {
        printf("错误:矩阵1的列数必须等于矩阵2的行数\n");
        return NULL;
    }

    // 1. 分配存储行指针的数组
    int** product = (int**) malloc(m1 * sizeof(int*));
    if (product == NULL) {
        printf("内存分配失败:无法创建行指针数组\n");
        return NULL;
    }

    // 2. 为每一行分配列内存,并自动初始化为0(用calloc更方便)
    for (int i = 0; i < m1; i++) {
        product[i] = (int*) calloc(n2, sizeof(int));
        if (product[i] == NULL) {
            // 分配失败时要回滚已分配的内存,避免泄漏
            for (int j = 0; j < i; j++) {
                free(product[j]);
            }
            free(product);
            printf("内存分配失败:无法创建第%d行的列内存\n", i);
            return NULL;
        }
    }

    // 3. 矩阵乘法核心循环
    for (int i = 0; i < m1; i++) {
        for (int j = 0; j < n2; j++) {
            int sum = 0;
            for (int k = 0; k < n1; k++) {
                sum += matrix1[i][k] * matrix2[k][j];
            }
            // 确保把计算结果赋值到正确的内存位置
            product[i][j] = sum;
        }
    }

    return product;
}

额外注意事项

  • 使用完乘积矩阵后,一定要逐层释放内存:先循环调用free(product[i])释放每一行的内存,再调用free(product)释放行指针数组,避免内存泄漏。
  • 每次调用malloc或calloc后都要检查返回值是否为NULL,处理内存分配失败的情况,让程序更健壮。
  • 你提到循环中检查数值非零,大概率是当时查看的是临时变量sum的值,但因为product[i][j]的内存未分配,导致赋值操作无效,最终读取的是未初始化的内存值(刚好全零)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:51:25