在我的CS50模糊过滤器上未定义的行为管理器

在我的CS50模糊过滤器上未定义的行为管理器,c,undefined-behavior,cs50,C,Undefined Behavior,Cs50,我似乎不明白为什么这个错误一直发生。我对编码相当陌生,这个程序应该使用框模糊来模糊图像,但当我尝试执行这个程序时,我会出错。我知道这可能不是最有效的解决方案,但任何关于如何让它工作的提示都将不胜感激 void blur(int height, int width, RGBTRIPLE image[height][width]) { RGBTRIPLE old[height][width]; for(int i = 0; i < height; i++) {

我似乎不明白为什么这个错误一直发生。我对编码相当陌生,这个程序应该使用框模糊来模糊图像,但当我尝试执行这个程序时,我会出错。我知道这可能不是最有效的解决方案,但任何关于如何让它工作的提示都将不胜感激

void blur(int height, int width, RGBTRIPLE image[height][width])
{
    RGBTRIPLE old[height][width];

    for(int i = 0; i < height; i++)
    {
        for(int j = 0; j < width; j++)
        {
            old[i][j] = image[i][j];
        }
    } 
    for(int i = 0; i < height; i++)
    {
        for(int j = 0; j < width; j++)
        {
            //top left corner
            if(j == 0 && i == 0)
            {
                image[i][j].rgbtRed = round( (old[i][j].rgbtRed + old[i][j+1].rgbtRed + old[i+1][j].rgbtRed + old[i+1][j+1].rgbtRed) /4);
                image[i][j].rgbtGreen = round( (old[i][j].rgbtGreen + old[i][j+1].rgbtGreen + old[i+1][j].rgbtGreen + old[i+1][j+1].rgbtGreen) /4);
                image[i][j].rgbtBlue = round( (old[i][j].rgbtBlue + old[i][j+1].rgbtBlue + old[i+1][j].rgbtBlue + old[i+1][j+1].rgbtBlue) /4);
            } 
            //top right corner
            else if(j == width && i == 0)
            {
                image[i][j].rgbtRed = round( (old[i][j].rgbtRed + old[i][j-1].rgbtRed + old[i+1][j].rgbtRed + old[i+1][j-1].rgbtRed) /4);
                image[i][j].rgbtGreen = round( (old[i][j].rgbtGreen + old[i][j-1].rgbtGreen + old[i+1][j].rgbtGreen + old[i+1][j-1].rgbtGreen) /4);
                image[i][j].rgbtBlue = round( (old[i][j].rgbtBlue + old[i][j-1].rgbtBlue + old[i+1][j].rgbtBlue + old[i+1][j-1].rgbtBlue) /4);
            } 
            //bottom left corner
            else if(j == 0 && i == height - 1)
            {
                image[i][j].rgbtRed = round( (old[i][j].rgbtRed + old[i][j+1].rgbtRed + old[i-1][j].rgbtRed + old[i-1][j+1].rgbtRed) /4);
                image[i][j].rgbtGreen = round( (old[i][j].rgbtGreen + old[i][j+1].rgbtGreen + old[i-1][j].rgbtGreen + old[i-1][j+1].rgbtGreen) /4);
                image[i][j].rgbtBlue = round( (old[i][j].rgbtBlue + old[i][j+1].rgbtBlue + old[i-1][j].rgbtBlue + old[i-1][j+1].rgbtBlue) /4);
            } 
            //bottom right corner
            else if(j == width && i == height - 1)
            {
                image[i][j].rgbtRed = round( (old[i][j].rgbtRed + old[i][j-1].rgbtRed + old[i-1][j].rgbtRed + old[i-1][j-1].rgbtRed) /4);
                image[i][j].rgbtGreen = round( (old[i][j].rgbtGreen + old[i][j-1].rgbtGreen + old[i-1][j].rgbtGreen + old[i-1][j-1].rgbtGreen) /4);
                image[i][j].rgbtBlue = round( (old[i][j].rgbtBlue + old[i][j-1].rgbtBlue + old[i-1][j].rgbtBlue + old[i-1][j-1].rgbtBlue) /4);
            } 
            //first row
            else if(i == 0 && j > 0 && j < width - 1)
            {
                image[i][j].rgbtRed = round( (old[i][j].rgbtRed + old[i][j+1].rgbtRed + old[i+1][j].rgbtRed + old[i+1][j+1].rgbtRed + old[i][j-1].rgbtRed + old[i+1][j-1].rgbtRed) /6);
                image[i][j].rgbtGreen = round( (old[i][j].rgbtGreen + old[i][j+1].rgbtGreen + old[i+1][j].rgbtGreen + old[i+1][j+1].rgbtGreen + old[i][j-1].rgbtGreen + old[i+1][j-1].rgbtGreen) /6);
                image[i][j].rgbtBlue = round( (old[i][j].rgbtBlue + old[i][j+1].rgbtBlue + old[i+1][j].rgbtBlue + old[i+1][j+1].rgbtBlue + old[i][j-1].rgbtBlue + old[i+1][j-1].rgbtBlue) /6);
            }
            //last row
            else if(i == height && j > 0 && j < width - 1)
            {
                image[i][j].rgbtRed = round( (old[i][j].rgbtRed + old[i][j+1].rgbtRed + old[i-1][j].rgbtRed + old[i-1][j+1].rgbtRed + old[i][j-1].rgbtRed + old[i-1][j-1].rgbtRed) /6);
                image[i][j].rgbtGreen = round( (old[i][j].rgbtGreen + old[i][j+1].rgbtGreen + old[i-1][j].rgbtGreen + old[i-1][j+1].rgbtGreen + old[i][j-1].rgbtGreen + old[i-1][j-1].rgbtGreen) /6);
                image[i][j].rgbtBlue = round( (old[i][j].rgbtBlue + old[i][j+1].rgbtBlue + old[i-1][j].rgbtBlue + old[i-1][j+1].rgbtBlue + old[i][j-1].rgbtBlue + old[i-1][j-1].rgbtBlue) /6);
            }
            //first column 
            else if(j == 0 && i > 0 && i < height - 1)
            {
                image[i][j].rgbtRed = round( (old[i][j].rgbtRed + old[i][j+1].rgbtRed + old[i+1][j].rgbtRed + old[i+1][j+1].rgbtRed + old[i-1][j].rgbtRed + old[i-1][j+1].rgbtRed) /6);
                image[i][j].rgbtGreen = round( (old[i][j].rgbtGreen + old[i][j+1].rgbtGreen + old[i+1][j].rgbtGreen + old[i+1][j+1].rgbtGreen + old[i-1][j].rgbtGreen + old[i-1][j+1].rgbtGreen) /6);
                image[i][j].rgbtBlue = round( (old[i][j].rgbtBlue + old[i][j+1].rgbtBlue + old[i+1][j].rgbtBlue + old[i+1][j+1].rgbtBlue + old[i-1][j].rgbtBlue + old[i-1][j+1].rgbtBlue) /6);
            }
            //last column
            else if(j == width && i > 0 && i < height - 1)
            {
                image[i][j].rgbtRed = round( (old[i][j].rgbtRed + old[i][j-1].rgbtRed + old[i+1][j].rgbtRed + old[i+1][j-1].rgbtRed + old[i-1][j].rgbtRed + old[i-1][j-1].rgbtRed) /6);
                image[i][j].rgbtGreen = round( (old[i][j].rgbtGreen + old[i][j-1].rgbtGreen + old[i+1][j].rgbtGreen + old[i+1][j-1].rgbtGreen + old[i-1][j].rgbtGreen + old[i-1][j-1].rgbtGreen) /6);
                image[i][j].rgbtBlue = round( (old[i][j].rgbtBlue + old[i][j-1].rgbtBlue + old[i+1][j].rgbtBlue + old[i+1][j-1].rgbtBlue + old[i-1][j].rgbtBlue + old[i-1][j-1].rgbtBlue) /6);
            }
            else if(i < height - 1 && j < width - 1)
            {
                image[i][j].rgbtRed = round( (old[i][j].rgbtRed + old[i][j+1].rgbtRed + old[i+1][j].rgbtRed + old[i+1][j+1].rgbtRed + old[i][j-1].rgbtRed + old[i+1][j-1].rgbtRed + old[i-1][j].rgbtRed + old[i-1][j-1].rgbtRed + old[j-1][i+1].rgbtRed) /9);
                image[i][j].rgbtGreen = round( (old[i][j].rgbtGreen + old[i][j+1].rgbtGreen + old[i+1][j].rgbtGreen + old[i+1][j+1].rgbtGreen + old[i][j-1].rgbtGreen + old[i+1][j-1].rgbtGreen + old[i-1][j].rgbtGreen + old[i-1][j-1].rgbtGreen + old[j-1][i+1].rgbtGreen) /9);
                image[i][j].rgbtBlue = round( (old[i][j].rgbtBlue + old[i][j+1].rgbtBlue + old[i+1][j].rgbtBlue + old[i+1][j+1].rgbtBlue + old[i][j-1].rgbtBlue + old[i+1][j-1].rgbtBlue + old[i-1][j].rgbtBlue + old[i-1][j-1].rgbtBlue + old[j-1][i+1].rgbtBlue) /9);
            }
        }
    }
}

当您尝试硬编码这么多边缘情况时(字面上是heh),可能会出现问题。为什么不试试矩阵遍历呢?i、 e以当前像素(
[i][j]
)为中心构造一个虚拟矩阵,现在遍历所述矩阵的所有有效像素并将它们相加。简单高效

//模糊图像
无效模糊(整数高度、整数宽度、RGB三重图像[高度][宽度])
{
RGB三倍旧[高度][宽度];
对于(int i=0;i

除了围绕每个像素构造一个假想矩阵,并检查所述矩阵的内部索引之外,这与您想要实现的效果相同。我们使这个问题简单得多。

当您尝试硬编码如此多的边缘情况时(字面上是heh),可能会出现问题。为什么不试试矩阵遍历呢?i、 e以当前像素(
[i][j]
)为中心构造一个虚拟矩阵,现在遍历所述矩阵的所有有效像素并将它们相加。简单高效

//模糊图像
无效模糊(整数高度、整数宽度、RGB三重图像[高度][宽度])
{
RGB三倍旧[高度][宽度];
对于(int i=0;i
除了围绕每个像素构造一个假想矩阵,并检查所述矩阵的内部索引外,这与您想要实现的效果相同。我们使这个问题简单得多。

“我似乎无法理解为什么会不断发生此错误。”
(关于异常信号:
==9889==该信号是由读取内存访问引起的。

尽管我同意另一个答案中提供的建议,但它并没有解决您所问的中心问题,这可能是由代码中的未定义行为引起的

注意:错误声明:
信号是由读取内存访问引起的。
是(UB)的一种症状,my的症状与您看到的情况相符。具体地说,您的代码在某个时刻试图写入它不拥有的内存。如果正在写入的非自有内存恰好不属于任何其他进程,那么您的程序甚至可能没有抛出异常。但是,在您的情况下,您的进程不拥有的内存很可能是由另一个进程拥有的,从而导致操作系统投诉并发出异常信号,表明您正在主动变更另一个进程的属性(内存位置)

有趣的是,您发布的代码没有显示任何明确的迹象表明分配试图访问不属于自己的内存。为所有赋值绑定嵌套循环所给定的条件:

   for(int i = 0; i < height; i++)
    {
        for(int j = 0; j < width; j++)
由for循环中的条件保证永远不允许
j==width
,从而防止可能试图写入例如
image[i][j].rgbtRed
(其中,如果
j==width
,将使数组的一个内存位置超出边界)的操作,并导致异常

因此,我建议,异常可能是由于代码未发布而发生的。(您从未在评论中回答错误发生的确切位置。)您尚未找到它。这将是一个非常好的举动,让你发现根本原因,无论它在哪里,并消除它

或者,你也可以发布一个更好的让别人访问的帖子
   for(int i = 0; i < height; i++)
    {
        for(int j = 0; j < width; j++)
else if(j == width && i == 0)
   typedef struct {
        int rgbtRed;    
        int rgbtGreen;
        int rgbtBlue;
    }RGBTRIPLE;
    

    void blur(int height, int width, RGBTRIPLE image[height][width]);
    
    int main(void)
    {
        
        RGBTRIPLE image[2][3] = {{{12,13,14},{14,15,16},{15,16,17}},{{16,17,18},{17,18,19},{18,19,20}}};
        blur(2, 3, image);
        return 0;
    }