sarah
sarah

Reputation: 59

Why is my code seg faulting when trying to extract the RGB components from a bmp file?

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

Answers (2)

deltamind106
deltamind106

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

Nate Eldredge
Nate Eldredge

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

Related Questions