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
相关产品推荐
相关产品推荐

