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

如何存储自定义矩阵乘法函数结果?解决lvalue赋值错误

问题分析与解决方案

你的代码存在几个核心问题,导致了编译错误和逻辑隐患:

1. 函数返回值与数组返回的错误

C语言不允许直接返回二维数组,你写的float multiply_matrix(...)返回类型是单个float,却试图返回temp[N][C2]——这不仅是越界访问(数组索引从0开始,temp[N][C2]超出了数组范围),就算想返回整个数组,局部变量temp在函数结束后会被销毁,返回它的指针会导致悬空指针问题。

2. 数组赋值的语法错误

数组名是不可修改的左值,不能用=直接赋值(比如stress_12 = multiple_matrix(...)),这就是你看到"not modifiable lvalue"和"expression must be an lvalue"错误的直接原因。

3. 矩阵乘法的逻辑错误

你内层循环的条件是a < N,但矩阵乘法的中间维度应该是第一个矩阵的列数(R1),不是N,这会导致计算结果错误。


修正后的代码实现

正确的矩阵乘法函数

把结果数组作为参数传入函数,让函数直接填充目标数组,这是C语言中处理数组输出的标准方式:

#include <stdio.h>

// 显式传入维度参数,适配可变长度数组
void multiply_matrix(int N, int R1, int R2, float mat_1[N][R1], float mat_2[R1][R2], float result[N][R2]) {
    // 初始化结果数组元素为0
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < R2; j++) {
            result[i][j] = 0.0f;
            // 矩阵乘法核心:遍历第一个矩阵的列/第二个矩阵的行
            for (int a = 0; a < R1; a++) {
                result[i][j] += mat_1[i][a] * mat_2[a][j];
            }
        }
    }
}

main函数中的调用方式

直接声明结果数组,调用函数填充即可:

int main() {
    // 根据实际需求定义矩阵维度
    const int N = 3, R1 = 2, R2 = 1;
    float T[N][R1] = {{1.0f, 2.0f}, {3.0f,4.0f}, {5.0f,6.0f}};
    float stress_input[R1][R2] = {{0.5f}, {1.0f}};
    float stress_12[N][R2];

    // 调用函数,结果直接存入stress_12
    multiply_matrix(N, R1, R2, T, stress_input, stress_12);

    // 打印结果验证
    for (int i = 0; i < N; i++) {
        printf("%.2f\n", stress_12[i][0]);
    }
    return 0;
}

关键说明

  • 显式传入维度参数(N、R1、R2),确保可变长度数组的合法性(C99及以上标准支持)。
  • 避免返回局部数组,通过参数传递目标数组,既安全又符合C语言语法规则。
  • 修正矩阵乘法的循环维度,保证计算逻辑正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 15:15:59