C语言动态内存分配实现矩阵乘法出现段错误问题求助
核心错误原因
- 二维指针内存分配逻辑错误:
int**类型代表行指针数组,仅需要分配「行数 × 指针类型大小」的空间,你代码中分配时多乘了列数,属于冗余错误。 - 结果矩阵
arr3未分配行内元素存储空间:你仅为arr3分配了行指针数组的内存,没有为每一行单独分配存储矩阵元素的内存,访问arr3[i][j]时操作野指针,是触发段错误的直接原因。 - 内存释放逻辑不完整:仅释放了行指针数组的内存,没有提前释放每一行的元素内存,存在严重内存泄漏。
- 你之前观察到的部分场景运行正常属于未定义行为的偶然表现,因为野指针刚好落在进程可访问的内存区间,并不代表代码逻辑正确。
修改方案
- 修正所有二维指针的分配逻辑,仅按行数分配行指针数组空间
- 结果矩阵
arr3在分配行指针数组后,逐行分配对应列数的元素存储空间 - 补充完整的内存释放逻辑,先释放每行元素内存,再释放行指针数组
修复后完整代码
#include<stdio.h> #include<stdlib.h> void create(int **arr,int r,int c) { int i,j; for(i=0;i<r;i++) { arr[i]=(int*)malloc(sizeof(int)*c); for(j=0;j<c;j++) scanf("%d",*(arr+i)+j); } } void display(int **arr,int r,int c) { int i,j; for(i=0;i<r;i++) { for(j=0;j<c;j++) printf("%d ",*(*(arr+i)+j)); printf("\n"); } } void multiply(int **arr1,int **arr2,int **arr3,int r,int c1,int c2) { int i,j,k; for(i=0;i<r;i++) { for(j=0;j<c2;j++) { arr3[i][j]=0; for(k=0;k<c1;k++) *(*(arr3+i)+j) += *(*(arr1+i)+k) * *(*(arr2+k)+j); } } } // 新增内存释放函数,避免重复代码 void free_matrix(int **arr, int r) { int i; for(i=0; i<r; i++) { free(arr[i]); } free(arr); } int main() { int **arr1,r1,c1,**arr2,r2,c2,**arr3; int i; printf("Enter rows and columns of first matrix: "); scanf("%d %d",&r1,&c1); // 修正分配逻辑,仅分配r1个int*大小的行指针数组 arr1=(int**)malloc(sizeof(int*)*r1); printf("\nEnter elements of first matrix: "); create(arr1,r1,c1); printf("\nThe first matrix is: \n"); display(arr1,r1,c1); printf("\nEnter rows and columns of second matrix: "); scanf("%d %d",&r2,&c2); // 修正分配逻辑 arr2=(int**)malloc(sizeof(int*)*r2); printf("\nEnter elements of second matrix: "); create(arr2,r2,c2); printf("\nThe second matrix is: \n"); display(arr2,r2,c2); if(c1!=r2) { printf("\nInvalid dimensions."); // 退出前释放已分配的内存 free_matrix(arr1, r1); free_matrix(arr2, r2); exit(0); } // 修正arr3分配逻辑 arr3=(int**)malloc(sizeof(int*)*r1); // 为arr3逐行分配元素存储空间 for(i=0; i<r1; i++) { arr3[i] = (int*)malloc(sizeof(int)*c2); } printf("\nThe product is: \n"); multiply(arr1,arr2,arr3,r1,c1,c2); display(arr3,r1,c2); // 释放所有矩阵内存 free_matrix(arr1, r1); free_matrix(arr2, r2); free_matrix(arr3, r1); return 0; }
内容的提问来源于stack exchange,提问作者145 BHASKAR BARMAN
相关产品推荐
相关产品推荐

