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

C语言中使用结构体的嵌套函数因调用顺序变更导致程序崩溃

问题根因定位

1. 数组越界写内存(核心崩溃原因)

在tridigonal_invert的LU分解逻辑中存在堆内存越界:
当循环变量i等于矩阵维度dim-1(你的测试用例中dim=4,i最终会走到3)时,执行upper.data[i+1+i*dim] = matrix.data[i+1+i*dim];语句,计算得到的索引为(dim-1)*dim + dim = dim*dim,而upper的data数组总长度是dim*dim,合法索引范围为0 ~ dim*dim - 1,越界写入直接破坏了堆元数据结构。后续调用square_matrix_multiplication时内部会执行calloc申请内存,触发堆异常直接导致程序无报错终止。
同理你在后续倒序处理upper矩阵的循环中,当i=dim-1时访问upper.data[i+1+i*dim]也属于越界读。

2. 函数缺失返回值(未定义行为)

tridigonal_invert函数声明返回Square_Matrix类型,但函数体中没有任何return语句,属于C标准定义的未定义行为,会导致不可预期的执行逻辑。

3. 内存泄漏(潜在问题)

square_matrix_multiplication内部用calloc申请了result.data内存,你直接将返回值传入print_square_matrix使用后没有释放对应内存,长期运行会出现内存泄漏问题。


修复建议

  • 给upper右上角元素的赋值逻辑加边界判断,当i == dim-1时跳过赋值操作,三对角矩阵最后一行本来就不存在右上角的非零元素
  • 给tridigonal_invert函数补充对应返回值,若不需要返回值直接将函数返回类型改为void即可
  • 每次调用完square_matrix_multiplication后,手动释放返回结构体的data指针
  • 编译时添加-g参数生成调试信息,程序崩溃后用gdb执行bt命令即可快速定位崩溃位置

内容的提问来源于stack exchange,提问作者Indiano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:45:05