使用动态内存分配与void函数实现矩阵乘法的代码运行错误求助
矩阵乘法代码错误修复方案
错误原因
- 二维数组内存分配逻辑错误
三个矩阵的行空间分配循环终止条件全部错误:- mat1共有
r1行,原代码循环判断条件写为i<c1,仅当矩阵为方阵时能分配正确的行数量,否则会出现少分配行空间、访问未初始化指针的问题,直接触发内存越界错误 - mat2共有
r2行,原代码循环判断条件写为i<c2,存在同样的越界风险 - 结果矩阵mat3共有
r1行、c2列,原代码循环判断条件写为i<c2,同样存在逻辑错误
这是触发-1073741819 (0xC0000005)错误码的核心原因。
- mat1共有
- 乘法逻辑循环存在多余分号
multiplication函数中,控制累加次数的t循环末尾多写了一个分号,导致循环体为空:循环执行完后t的值等于c1,后续的累加逻辑仅执行一次,且直接访问数组越界位置,累加逻辑完全没有生效,最终输出结果要么全为0,要么为内存中的垃圾值。
修复后的完整代码
#include <stdio.h> #include <stdlib.h> int r1, r2, c1, c2, **mat1, **mat2, **mat3, i, j, t; void check(int c1, int r2); void input(); void inputDisplay(); void multiplication(int **mat1,int **mat2); void displayOutput(int **mat3); int main() { printf("enter the dimensions of first matrix\n"); scanf("%d%d", &r1, &c1); printf("enter the dimensions of second matrix\n"); scanf("%d%d", &r2, &c2); check(c1, r2); mat1 = (int **)malloc(r1*sizeof(int *)); for(i=0; i<r1; i++) // 修复:循环次数为行数r1 { mat1[i] = (int *)malloc(c1*sizeof(int)); } mat2 = (int **)malloc(r2*sizeof(int *)); for(i=0; i<r2; i++) // 修复:循环次数为行数r2 { mat2[i] = (int *)malloc(c2*sizeof(int)); } mat3 = (int **)malloc(r1*sizeof(int *)); for(i=0; i<r1; i++) // 修复:循环次数为结果矩阵行数r1 { mat3[i] = (int *)malloc(c2*sizeof(int)); } input(); inputDisplay(); multiplication(mat1, mat2); displayOutput(mat3); // 补充内存释放逻辑避免内存泄漏 for(i=0; i<r1; i++) free(mat1[i]); free(mat1); for(i=0; i<r2; i++) free(mat2[i]); free(mat2); for(i=0; i<r1; i++) free(mat3[i]); free(mat3); return 0; } void check(int c1, int r2) { if(c1 != r2) { printf("these two matrices are not compatible for multiplication"); exit(EXIT_FAILURE); } } void input() { printf("enter first matrix\n"); for(i=0; i < r1; i++) { for(j=0; j<c1; j++) { printf("value of %d row and %d column:", i + 1, j +1); scanf("%d", &mat1[i][j]); } } printf("enter second matrix\n"); for(i=0; i<r2; i++) { for(j=0; j<c2; j++) { printf("value of %d row and %d column:", i + 1, j +1); scanf("%d", &mat2[i][j]); } } } void inputDisplay() { printf("first matrix is:"); for(i=0; i<r1; i++) { printf("\n"); for(j=0; j<c1; j++) { printf("%d\t", mat1[i][j]); } } printf("\nsecond matrix is:"); for(i=0; i<r2; i++) { printf("\n"); for(j=0; j<c2; j++) { printf("%d\t", mat2[i][j]); } } } void multiplication(int **mat1, int **mat2) { for(i=0; i<r1; i++) { for(j=0; j<c2; j++) { mat3[i][j] = 0; for(t = 0; t < c1; t++) // 修复:删除末尾多余分号 { mat3[i][j] += mat1[i][t]*mat2[t][j]; } } } } void displayOutput(int **mat3) { printf("\nresultant matrix is:"); for(i=0; i<r1; i++) { printf("\n"); for(j=0; j<c2; j++) { printf("%d\t", mat3[i][j]); } } }
验证说明
使用你提供的2x2全1矩阵测试用例,修复后输出的结果矩阵为2x2全2,符合矩阵乘法计算预期。
内容的提问来源于stack exchange,提问作者Nick Gz
相关产品推荐
相关产品推荐

