Я пытаюсь взять файл bmp и сделать полутоновую копию. Я изучаю динамическое распределение, и мне приходится динамически выделять 2D-массив, в который я импортирую BMP-файл и манипулирую им, поэтому он будет работать с различными размерами изображения. Но ближе к концу (я обозначил, где) я получаю Seg Fault, и я понятия не имею, почему. Все отлично работает, если я не динамически выделяю «пиксели».c - ошибка сегментации, назначаемая массиву 2d
#include <stdio.h>
#include <stdlib.h>
int main(void) {
const int HEADER_SIZE = 54;
FILE *infile = fopen("test1.bmp", "rb");
FILE *outfile1 = fopen("copy1.bmp", "wb");
int i, width, height, r, c, bmpsize;
char header[HEADER_SIZE], filename[32];
char **pixels; //initialize pixels here
puts("Enter the filename: ");
i = -1;
while(filename[i] != '\n')
{
i++;
scanf("%c", &filename[i]);
}
filename[i] = '.';
filename[i+1] = 'b';
filename[i+2] = 'm';
filename[i+3] = 'p';
filename[i+4] = '\0';
i = -1;
while(filename[i] != '\0')
{
i++;
printf("%c", filename[i]);
}
infile = fopen(filename, "rb");
puts("Enter the height and width (in pixels): ");
scanf("%d%d", &height, &width);
bmpsize = 3 * width * height;
pixels = malloc(height * sizeof(char*)); //DA part 1
for(i = 0; i < height; i++)
{
pixels[i] = malloc((width * 3) * sizeof(char)); //DA part 2
}
fread(header, 1 , HEADER_SIZE, infile);
fread(pixels, 1 , bmpsize, infile);
for(r = 0; r < height; r++) {
for (c = 0; c < width*3; c += 3) {
int avg= 0;
puts("THIS PUTS PRINTS: THE NEXT LINE IS MY PROBLEM");
avg = ((int) pixels[r][c] + (int) pixels[r][c+1] + (int) pixels[r][c+2])/3;//This is my problem line, why?
puts("THIS PUTS DOESN'T PRINT. ERROR: SEG. FAULT(core dumped)");
pixels[r][c] = (char) avg;
pixels[r][c+1] = (char) avg;
pixels[r][c+2] = (char) avg;
}
}
puts("Done. Check the generated images.");
fwrite(header, sizeof(char) , HEADER_SIZE, outfile1);
fwrite(pixels, sizeof(char) , bmpsize, outfile1);
fclose(infile);
fclose(outfile1);
return 0;
}
Лучше всего добавить тег C для вопроса C – mathematician1975
, независимо от проблемы, вы все равно должны проверить, что вы не получаете указатели NULL, возвращаемые malloc. Выделение указателя NULL также даст вам segfault. – user1514631
Do 'char (* pixels) [width * 3] = malloc (width * height * 3);', тогда вы можете использовать 'pixels [r] [c]', а также 'fread'. BTW проверяет возвращаемое значение 'fread' и' malloc'. –