C语言运行Lapenta_Markidis函数报stack smashing detected错误求排查
错误诱因分析
stack smashing detected错误本质是栈上数组发生了越界写操作,破坏了栈的保护检测数据,你的代码里存在多处明确的数组下标越界问题,以及次要的逻辑语法错误:
核心越界问题(直接触发栈粉碎)
C语言中长度为3的数组合法下标范围是0~2,你代码中所有声明为[3]的数组,都出现了访问下标为3的错误,且存在下标漏写问题:
- 雅可比矩阵计算段所有访问
B[3]、upartk[3]、upart[3]的语句全部越界,包括J11到J33的所有计算行。 - dupartk赋值段仅对下标1、2、3赋值,不仅
dupartk[3]越界,还完全遗漏了dupartk[0]的赋值,导致后续循环更新upartk时读取未初始化值,同时越界写入栈空间。
次要逻辑/语法错误
- 计算C2的行
C2[i] = -( upartk[i] / (gL_new*c2) )/ ((gL_new + gL),2) ;中误用了逗号表达式,实际除数会被计算为常量2,而非你预期的(gL_new + gL)的平方,正确写法应该是/ pow(gL_new + gL, 2)。 - 雅可比行列式
Det没有做0值判断,存在除以零的崩溃风险。
修复方案
- 将代码中所有数组访问的下标从
1/2/3对应修改为0/1/2,补全dupartk[0]的赋值语句。 - 修正C2计算行的语法错误。
- 可选添加Det为0的异常分支处理,避免除零错误。
内容的提问来源于stack exchange,提问作者Jokerp
相关产品推荐
相关产品推荐

