首页 > 解决方案 > 不同的写作,同样的事情:一个给出分段错误,另一个没有

问题描述

有什么理由会导致分段错误:

#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 图像的每个像素上重复。这只发生在大图像上,而小图像既不返回段错误。

标签: cif-statementsegmentation-faultcs50

解决方案


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


推荐阅读