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

C语言连续行主序数组朴素矩阵乘法输出垃圾值求助

调试建议与问题修复

核心问题:打印循环的迭代变量错误

你代码里的垃圾值主要来自main函数的结果打印循环,内层循环错误地递增了i而非j:

// 错误代码
for (j = 0; j < zdim_1; i++) {
    printf("\t%f", z[i * zdim_1 + j]);
}

这会导致i快速超出矩阵行数的范围(zdim_0=2),进而访问z数组的越界内存,输出垃圾值。修复方式是把i++改成j++:

// 修复后
for (j = 0; j < zdim_1; j++) {
    printf("\t%f", z[i * zdim_1 + j]);
}

额外验证与优化建议

  1. 矩阵乘法逻辑验证
    你的矩阵乘法索引逻辑是正确的:

    • 行主序下,矩阵A(x)的第i行第p列元素索引为i * astride + p(astride为A的列数xdim_1=4)
    • 矩阵B(y)的第p行第j列元素索引为p * bstride + j(bstride为B的列数ydim_1=2)
    • 结果矩阵C(z)的第i行第j列元素索引为i * cdim_1 + j
      可以手动计算一个值验证:比如X第一行[1,2,3,4]乘Y第一列[2,4,6,8],结果应为60,修复打印后应该能看到这个值。
  2. 添加内存分配检查
    为避免malloc失败导致后续错误,建议在分配内存后添加空指针检查:

    x = (double *) malloc(xdim_0 * xdim_1 * sizeof(double));
    y = (double *) malloc(ydim_0 * ydim_1 * sizeof(double));
    z = (double *) malloc(zdim_0 * zdim_1 * sizeof(double));
    if (!x || !y || !z) {
        fprintf(stderr, "内存分配失败\n");
        return 1;
    }
    
  3. 可选:打印输入矩阵验证初始化
    可以添加代码打印X和Y矩阵,确认初始化的数值是否符合预期,排除数据初始化的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:07:07