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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:06:32