不同的写作,同样的事情:一个给出了分段错误,另一个没有

Different writing, same thing: one gives segmentation fault, the other doesn't

是否有任何原因会导致分段错误:

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

typedef uint8_t  BYTE;

typedef struct
{
    BYTE  rgbtBlue;
    BYTE  rgbtGreen;
    BYTE  rgbtRed;
} __attribute__((__packed__))
RGBTRIPLE;

void edges(int height, int width, RGBTRIPLE image[height][width]) {
    RGBTRIPLE original[height][width];
            
    for(int i = 0; i < height; i++)
        for(int j = 0; j < width; j++)
            original[i][j] = image[i][j];
  
    for(int i = 0; i < height; i++)
        for(int j = 0; j < width; j++)
            for(int k = i - 1; k < i + 2; k++)
                for(int m = j - 1; m < j + 2; m++)
                    if(k < 0 || m < 0 || k == height || m == width) {
                        original[k][m].rgbtRed = 0;
                        original[k][m].rgbtGreen = 0;
                        original[k][m].rgbtBlue = 0;
                    }
}

与此相反?

if(k < 0 || m < 0 || k == height || m == width) {
   original[k][m].rgbtRed = original[k][m].rgbtGreen = original[k][m].rgbtBlue = 0;
}

这是唯一的区别,前者会出现分段错误,而后者不会。

如果重要的话,我正在使用 CS50 IDE。

我无法给出完整的上下文,因为代码有数百行,但本质上这只是重复了 bmp 图像的每个像素。这只发生在大图像上,而小图像则不会 returns 段错误。

在C语言中,禁止访问范围[0, N-1]之外的大小为N的数组。 在这两种情况下,您访问的都是超出此范围的内容,这就是出现分段错误的原因。