使用指针的C语言矩阵乘法程序在M1 Mac输入矩阵阶数后出现段错误
代码故障根源
- 二级指针未分配顶层内存:你定义的
arr1、arr2均为二级指针,本质是用来存储每行一级指针地址的数组,你直接为arr1[i]申请内存,但arr1本身没有提前申请对应m个int*类型的空间,访问arr1[i]属于野指针操作,直接触发段错误。同理matmul函数内的结果矩阵arr也是二级指针,未分配顶层内存就直接给arr[i]分配内存,同样会触发野指针访问。 - 矩阵乘法逻辑错误:
matmul函数内列循环写为for(j=0;j<1;j++),只会计算结果矩阵的第0列,其余列完全未处理。 - 结果矩阵元素未初始化:对
*(arr[i]+j)直接执行+=操作,初始值为内存垃圾值,计算结果完全错误。 main函数返回值不符合C标准:标准C要求main返回值为int,定义为void main属于不规范写法,部分编译器会抛出异常。- 存在内存泄漏:所有
malloc分配的内存没有对应的free释放,程序长期运行会产生多余内存占用。
M1 设备调试方案
Mac M1无需安装gdb,使用系统自带工具即可完成调试:
- lldb调试:
- 编译代码时添加
-g参数生成调试符号:clang -g matmul.c -o matmul - 执行
lldb ./matmul启动调试,输入run运行程序,触发段错误后输入bt即可查看调用栈,直接定位出错代码行。
- 编译代码时添加
- 地址消毒工具定位内存问题:编译时添加
-fsanitize=address参数,命令为clang -fsanitize=address matmul.c -o matmul,运行程序后会直接输出野指针访问、内存越界的具体位置,定位效率更高。
核心代码修复示例
// main函数内修改arr1分配逻辑 printf("Enter the order of first matrix\n"); scanf("%d%d",&m,&n); // 新增:为二级指针分配顶层空间 arr1 = (int **)malloc(sizeof(int *) * m); for(i=0;i<m;i++) arr1[i] = (int *)malloc(sizeof(int)*n); // main函数内修改arr2分配逻辑 printf("Enter the order of second matrix\n"); scanf("%d%d",&p,&q); // 新增:为二级指针分配顶层空间 arr2 = (int **)malloc(sizeof(int *) * p); for(i=0;i<p;i++) arr2[i] = (int *)malloc(sizeof(int)*q); // matmul函数内修改结果矩阵分配和循环逻辑 // 新增:为结果矩阵二级指针分配顶层空间 arr = (int **)malloc(sizeof(int *) * m); for(i=0;i<m;i++){ arr[i] = (int *)malloc(sizeof(int)*q); // 初始化元素值为0 for(j=0;j<q;j++) arr[i][j] = 0; } // 修改列循环上限 for(i=0;i<m;i++) for(j=0;j<q;j++) // 原代码j<1修改为j<q for(k=0;k<n;k++) *(arr[i]+j) += (*(arr1[i]+k))*(*(arr2[k]+j));
内容的提问来源于stack exchange,提问作者A_01_Abhilash S Hathwar
相关产品推荐
相关产品推荐

