无法将C bmp读入内存

时间:2015-11-06 01:40:28

标签: c bmp

我正在尝试将.bmp标头读入内存。我在运行程序时收到核心转储。

BMP_Image *Read_BMP_Header(FILE* fptr) {

    fseek(fptr, 0, SEEK_SET);
    BMP_Image *bmp_image = NULL;

    bmp_image = malloc(sizeof(BMP_Header));
    fread(&bmp_image->header, sizeof(BMP_Header), 1, fptr);
    return bmp_image;
}

恐惧中的错误。

标题结构是:

typedef struct _BMP_Header
{
    uint16_t type;          // Magic identifier
    uint32_t size;          // File size in bytes
    uint16_t reserved1;         // Not used
    uint16_t reserved2;         // Not used
    uint32_t offset;            // Offset to image data in bytes from beginning of file (54 bytes)
    uint32_t DIB_header_size;       // DIB Header size in bytes (40 bytes)
    int32_t  width;         // Width of the image
    int32_t  height;            // Height of image
    uint16_t planes;            // Number of color planes
    uint16_t bits;          // Bits per pixel
    uint32_t compression;       // Compression type
    uint32_t imagesize;         // Image size in bytes
    int32_t  xresolution;       // Pixels per meter
    int32_t  yresolution;       // Pixels per meter
    uint32_t ncolours;          // Number of colors  
    uint32_t importantcolours;      // Important colors 
} BMP_Header;

,图像结构为:

typedef struct _BMP_Image {
    BMP_Header header;
    unsigned char *data; 
} BMP_Image;

2 个答案:

答案 0 :(得分:1)

您的主要问题是

bmp_image = malloc(sizeof(BMP_Header));

应该是

bmp_image = malloc(sizeof(BMP_Image));

你可以像这样避免这种错误

bmp_image = malloc(sizeof(*bmp_image));

这可能失败的原因可能很多,但这肯定是错误的,因为你为BMP_Header *分配空间,但用BMP_Image *指向它,这是一个不同大小的结构。取消引用指针变为未定义的行为,您无法保证给定的行为。

答案 1 :(得分:0)

我明白了。我不得不将imagesize与sizeof(unsigned char)相乘,并且在我阅读它的时候也是如此。老实说,我不知道为什么这很重要但是我让它工作了。