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

CS50 Pset4模糊滤镜出现Segmentation fault/浮点异常求助

CS50 Pset4 模糊滤镜代码错误排查

你的代码里有几个关键错误,直接导致了段错误和计算异常:

1. 数组索引顺序颠倒

你访问copy数组时写了copy[l][k],但copy的维度是[height][width],第一个索引对应行(循环变量k,和i同为行号),第二个对应列(循环变量l,和j同为列号),正确写法应为copy[k][l]。索引颠倒后,当l值大于等于height时会越界访问内存,触发段错误。

2. 邻域循环范围错误

k < i + 1和l < j + 1的条件会让循环只遍历到k=i和l=j,漏掉i+1行、j+1列的邻域像素。需改成k <= i + 1和l <= j + 1,才能覆盖当前像素周围3x3的全部邻域。

3. 累加变量未重置

RedNeighbour、BlueNeighbour等累加变量在所有循环外定义,处理下一个像素时会保留上一次的累加值,导致计算完全错误。必须在每个(i,j)像素的循环开头(进入k、l循环前),将这些变量重置为0。

4. 整数除法导致精度丢失

RedNeighbour/neighbourSum是整数除法,会直接截断小数部分,后续的round无法发挥作用。需先把分子转为浮点数再计算,比如(float)RedNeighbour / neighbourSum,才能得到正确的平均值并四舍五入。


修正后的代码:

// Blur image
void blur(int height, int width, RGBTRIPLE image[height][width])
{
    // Copy image to "copy"
    RGBTRIPLE copy[height][width];
    for(int i = 0; i < height; i++)
    {
        for(int j = 0; j < width; j++)
        {
            copy[i][j] = image[i][j];
        }
    }

    for(int i = 0; i < height; i++)
    {
        for(int j = 0; j < width; j++)
        {
            // 每个像素单独初始化累加变量
            int RedNeighbour = 0; 
            int BlueNeighbour = 0; 
            int GreenNeighbour = 0; 
            int neighbourSum = 0;

            // 修正循环范围,覆盖3x3邻域
            for(int k = i - 1; k <= i + 1; k++)
            {
                for(int l = j - 1 ; l <= j + 1; l++)
                {
                    if(k >= 0 && k < height && l >= 0 && l < width)
                    {
                        // 修正数组索引顺序
                        RedNeighbour += copy[k][l].rgbtRed;
                        BlueNeighbour += copy[k][l].rgbtBlue;
                        GreenNeighbour += copy[k][l].rgbtGreen;
                        neighbourSum++;
                    }
                }
            }
            // 转浮点计算平均值,避免整数截断
            image[i][j].rgbtRed = round((float)RedNeighbour / neighbourSum);
            image[i][j].rgbtBlue = round((float)BlueNeighbour / neighbourSum);
            image[i][j].rgbtGreen = round((float)GreenNeighbour / neighbourSum);
        }
    }
    return;
}

内容的提问来源于stack exchange,提问作者hélène

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:51:03