SIGABRT на fclose () при чтении из файла изображения - PullRequest
0 голосов
/ 14 апреля 2019

Я пытаюсь прочитать данные из файла изображения .bmp, чтобы я мог ими манипулировать.Однако после прочтения данных у меня возникают две проблемы, которые, по моему мнению, связаны между собой.Во-первых, при вызове fclose () я получаю sigabrt, а во-вторых, если я просто закомментирую fclose (), все данные, которые я прочитал в массив структуры, будут установлены в 255, даже если они были правильно прочитаны ранее.Я довольно новичок в C, так что это почти наверняка ошибка новичка в распределении динамической памяти.

Pixel** readFile(FILE* fp,Header* header,InfoHeader* infoHeader)
{

    if(fp == NULL)
    {
        printf("file not found\n");
        return NULL;
    }

    fread(&header->Type,SHORTSIZE,1,fp);
    fread(&header->Size,INTSIZE,1,fp);
    fread(&header->Reserved1,SHORTSIZE,1,fp);
    fread(&header->Reserved2,SHORTSIZE,1,fp);
    fread(&header->Offset,INTSIZE,1,fp);

    fread(&infoHeader->Size,INTSIZE,1,fp);
    fread(&infoHeader->Width,INTSIZE,1,fp);
    fread(&infoHeader->Height,INTSIZE,1,fp);
    fread(&infoHeader->Planes,SHORTSIZE,1,fp);
    fread(&infoHeader->Bits,SHORTSIZE,1,fp);
    fread(&infoHeader->Compression,INTSIZE,1,fp);
    fread(&infoHeader->ImageSize,INTSIZE,1,fp);
    fread(&infoHeader->xResolution,INTSIZE,1,fp);
    fread(&infoHeader->yResolution,INTSIZE,1,fp);
    fread(&infoHeader->Colors,INTSIZE,1,fp);
    fread(&infoHeader->ImportantColors,INTSIZE,1,fp);

    int rows = infoHeader->Height;
    int cols = infoHeader->Width;


    Pixel** pixelArr = malloc(rows * sizeof(Pixel*));

    int i;
    for (i = 0; i < cols; i++)
    {
        pixelArr[i] = (Pixel*) malloc(sizeof(Pixel));
    }


    int j;
    for(i = 0; i < rows; i++)
    {
        for(j = 0; j < cols; j++)
        {

            fread(&pixelArr[i][j].Red,CHARSIZE,1,fp);
            fread(&pixelArr[i][j].Green,CHARSIZE,1,fp);
            fread(&pixelArr[i][j].Blue,CHARSIZE,1,fp);
        }
        printf("\n");
    }

    fclose(fp);


    return pixelArr;
}
...