不同的写作,同样的事情:一个给出了分段错误,另一个没有
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的数组。
在这两种情况下,您访问的都是超出此范围的内容,这就是出现分段错误的原因。
是否有任何原因会导致分段错误:
#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的数组。 在这两种情况下,您访问的都是超出此范围的内容,这就是出现分段错误的原因。