Reputation: 59
I am trying to extract the RGB components from a bmp file but I am getting a seg fault when it gets to Data[i][j].Blue
. I try printing out the hex of the three colors and it prints them out good but then it prints out that all RGB components are 0xFF and then it seg faults when it gets to the blue. Any help I get is greatly appreciated.
int inputColors(char *filename, struct INFOHEADER *InfoHeader, struct PIXEL **Data){
int i = 0, j = 0;
FILE *inputFile;
printf("The height of the picture is %d\n", InfoHeader->Height);
printf("The width of the picture is %d\n", InfoHeader->Width);
if((inputFile = fopen(filename, "r")) == NULL){
printf("Unable to open .bmp file\n");
exit(1);
}
//Mallocing enough space for the 2D structures of pixels (colors)
Data = (struct PIXEL **)malloc(InfoHeader->Width * sizeof(struct PIXEL *));
for(i = 0; i < InfoHeader->Height; i++){
Data[i] = (struct PIXEL *)malloc(InfoHeader->Height * InfoHeader->Width * sizeof(struct PIXEL));
}
//This goes until after we are down with the header
fseek(inputFile, 54, SEEK_SET);
//Inputing the data into the malloced struct
i = 0;
for(i = 0; i < InfoHeader->Height; i++){
for(j = 0; j < InfoHeader->Width; j++){
Data[i][j].Red = getc(inputFile);
// printf("The Red componet is %X\n", Data[i][j].Red);
Data[i][j].Green = getc(inputFile);
// printf("The green componet is %X\n", Data[i][j].Green);
Data[i][j].Blue = getc(inputFile);
// printf("The blue componet is %X\n", Data[i][j].Blue);
}
}
fclose(inputFile);
return 0;
}
Upvotes: 0
Views: 335
Reputation: 707
Well for starters, your first malloc uses
InfoHeader->Width * sizeof(struct PIXEL *)
But then you use InfoHeader->Height when iterating over the array. Because of this mismatch, If InfoHeader->Width is smaller than InfoHeader->Height, it will not allocate enough memory to perform the iteration, and it will SEGFAULT.
Upvotes: 1
Reputation: 58152
Data = (struct PIXEL **)malloc(InfoHeader->Width * sizeof(struct PIXEL *));
// ^^^^^
for(i = 0; i < InfoHeader->Height; i++){
// ^^^^^^
Data[i] = (struct PIXEL *)malloc(InfoHeader->Height * InfoHeader->Width * sizeof(struct PIXEL));
}
Upvotes: 0