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

CS50 PS4 Filter(Less) BLUR实现触发段错误 求排查代码问题

段错误根因

你的代码触发段错误是三类语法/逻辑错误共同导致的:

  • 相等判断写成赋值:所有条件分支里判断变量是否等于某个值时,你都把比较运算符==写成了赋值运算符=。例如else if((i=0)&&...)的作用不是判断i是否为0,而是直接把循环变量i强制赋值为0,彻底打乱外层循环的遍历顺序,直接导致内存访问越界。其中左下角的判断还错用了位运算符&代替逻辑与&&,进一步造成逻辑混乱。
  • 连续比较不符合C语法:C语言不支持数学式的连续大小比较写法,你写的(height-1)>i>0、(width-1)>j>0不会按照“i在0到height-1之间”的逻辑执行。C会从左到右运算:先算(height-1)>i得到0(假)或1(真)的布尔值,再拿这个0/1和0比较,判断结果完全不符合预期,导致大量边界像素走到错误的处理分支,访问i=-1/i=height/j=-1/j=width这类不存在的数组下标,直接越界触发段错误。正确的区间判断需要拆分后用逻辑与连接,例如判断非边缘点要写成i > 0 && i < height-1 && j > 0 && j < width-1。
  • 循环嵌套位置错误:你把copy数组回写到原image数组的两层循环,错误嵌套在了内层像素遍历的j循环内部。相当于每处理1个像素,就会执行一次全数组拷贝,此时copy数组绝大多数位置还没完成计算,存储的是随机脏数据,混乱的循环嵌套也会进一步触发非法内存访问。正确逻辑是等所有像素的模糊值全部计算写入copy数组后,再在遍历循环的最外层执行回写操作。
其他隐藏逻辑bug

就算修复上述段错误问题,代码还有一处越界问题:你处理右上角(i=0、j=width-1)的分支中,错误引用了image[i-1][j]、image[i-1][j-1]两个像素——i此时为0,i-1等于-1属于非法下标,第一行像素不存在上一行相邻点,应该取i+1行的对应相邻像素计算平均值。

修正步骤
  1. 把所有条件判断里用于相等比较的=全部替换为==,把单独的&逻辑判断替换为&&
  2. 把所有连续大小比较拆分为x > min && x < max的标准C写法
  3. 将回写原数组的两层循环,移动到两层像素计算循环的外部,确保所有模糊值计算完成后再执行拷贝
  4. 逐行检查四个角、四条边分支的相邻像素下标,确保所有下标都在[0, height-1]和[0, width-1]的合法范围内

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:06:21