1

我正在尝试设计一个将位图图像加载到内存中并最终显示它的函数。我正在使用 Watcom 16 位 C 编译器编译代码,目标设置为 DOS。我在 DOSBox 中运行程序。代码如下:

#ifndef __BITMAP_H__
#define __BITMAP_H__

#include <stdio.h>
#include <stdlib.h>

typedef struct DIB
{
    int header_size;
    int px_width;
    int px_height;
}DIB_t;

DIB_t *load_bitmap(char *file_name)
{
    FILE *bmp_file;
    DIB_t *bitmap;
    char garbage[4];
    int c, file_size, pixel_offset;

    bitmap = (DIB_t*)malloc(sizeof bitmap);

    if(!bitmap)
    {
        perror("malloc()");
        return NULL;
    }

    bmp_file = fopen(file_name, "rb");

    if(!bmp_file)
    {
        perror("fopen()");
        return NULL;
    }

    c = fgetc(bmp_file);

    if(c == 'B')
    {
        c = fgetc(bmp_file);

        if(c == 'M')
        {
            fread(&file_size, 4, 1, bmp_file);
            fread(garbage, 1, 4, bmp_file);
            fread(&pixel_offset, 4, 1, bmp_file);
            fread(&bitmap->header_size, 4, 1, bmp_file);
            fread(&bitmap->px_width, 4, 1, bmp_file);
            fread(&bitmap->px_height, 4, 1, bmp_file);
            printf("BMP width: %dpx\nBMP Height: %dpx", bitmap->px_width, bitmap->px_height);
            fclose(bmp_file);
            return bitmap;
        }
    }

    fputs("File format not supported.\n", stderr);
    fclose(bmp_file);
    return NULL;
}
#endif

当你运行这个程序时,它会输出:"BMP width: %dpx\n" 但是换行符后面什么都没有?我觉得这非常奇怪。我已经确认没有任何操作失败或设置 errno 并且 px_height 实际上设置为它的适当值。你们中有人有过这种经历吗?

4

2 回答 2

2

你只为这一行的指针分配了足够的空间

bitmap = (DIB_t*)malloc(sizeof(bitmap));

你真正需要的是

bitmap = (DIB_t*)malloc(sizeof(DIB_t));

此外,正如 mrbatch 所指出的,您正在使用 16 位编译器,因此尝试将 4 字节数据读入 2 字节int变量。确保您的类型的 sizeof() 与您正在阅读的内容相匹配,例如long int

所以 - 一般来说 - 你通过写比你应该的更多的数据来破坏你的堆栈和堆,你可以期望你的程序表现得非常奇怪:)

于 2013-07-22T16:50:18.153 回答
2

除了 Paulsizeof为您更正的答案之外malloc,请尝试将您的int值更改为long在他们的声明中(我假设您的代码对于包含要读取的 4 字节值的位图是正确的)。一个int16 位编译器将是 2 个字节。对于 4 字节的值, 您需要一个long(或等效的)。long int


正如评论中所建议的,更好的是包含inttypes.h和使用int32_t而不是intlong确保 32 位值。

于 2013-07-22T16:55:57.633 回答