如何存储自定义矩阵乘法函数结果?解决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
相关产品推荐
相关产品推荐

