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

使用指针的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调试:
    1. 编译代码时添加-g参数生成调试符号:clang -g matmul.c -o matmul
    2. 执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:24:01