我正在尝试将.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;
答案 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)相乘,并且在我阅读它的时候也是如此。老实说,我不知道为什么这很重要但是我让它工作了。