【发布时间】:2021-06-15 19:01:44
【问题描述】:
有什么原因会导致分段错误:
#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 图像的每个像素上重复。这只发生在大图像上,而小图像既不返回段错误。
【问题讨论】:
-
如果这些索引中的任何一个是
< 0,您就有未定义的行为。 -
您正在使用
or这意味着,如果即k == -23条件为真并且语句将被执行。这意味着original[-23][m]。这肯定不是你想要的。 -
解决方法?不是真的:只是围绕访问越界元素的代码。或 (BIG BIG OR) 使您的数组大于所需的大小,以便您在顶部、底部、右侧、左侧有额外的元素......并且 still 避免写入越界!
-
那么你应该展示一个完整的最小样本。
-
发布minimal reproducible example 来拯救我们所有的时间。当然
original[][]被越界访问了。
标签: c if-statement segmentation-fault cs50