C语言操作数组求解3Sum时触发stack smashing报错的原因
3Sum代码触发
*** stack smashing detected ***: terminated报错的原因 这个报错是GCC编译器默认开启的栈保护机制抛出的,本质是栈上内存发生了越界写入,具体触发原因有几个:
- 结果数组分配的空间完全不够用
你在main函数里定义的结果数组r长度只有6,最多存6个int值,也就是最多放2组三元组结果(每组3个值)。但你写的三层暴力循环会枚举大量三元组,光是你给的测试用例[-1,0,1,2,-1,-4]本身就不止2组合法三元组,加上代码逻辑有bug会算出很多重复结果,往r里写的元素总数远远超过6,数组边界直接被写穿。 - 下标去重判断逻辑写废了
代码里用if(i!=j!=k)想判断三个下标互不相等,这个写法在C语言里完全达不到效果。不等于运算符是左结合的,运算时先算i!=j,得到0(假)或者1(真)的布尔值,再拿这个值和k比较是否不等。举个例子:i=0、j=0、k=1的时候,i!=j结果是0,0!=1结果为真,这时候i和j明明是同一个下标,判断条件居然成立,会把大量重复、非法的三元组写入结果数组,越界写的问题更严重。 - 附带的低级笔误
你定义的处理函数名字是proc,main里调用的时候写的是add,正常编译阶段就会报函数未定义的错误,属于手滑打错了。
栈保护机制的逻辑很简单:编译器会在每个函数的栈帧里插一个随机生成的校验值(叫栈金丝雀),就在返回地址前面,函数返回前会先检查这个值有没有被改。如果发生栈上数组越界写,这个校验值大概率会被覆盖,编译器检测到异常就会直接终止程序,防止栈溢出被用来执行恶意代码,你碰到的报错就是这个机制触发的。
内容的提问来源于stack exchange,提问作者whisper20
相关产品推荐
相关产品推荐

