为什么bool / char分配4个字节而不是1个?

时间:2013-06-12 12:23:46

标签: c boolean

我正在尝试正确加载一个包含1个char作为bool的结构。它看起来应该可以正常工作但是当我在bool上打印数据时它会失败,因为它读取4个字节而不是1个。

typedef struct
{
    char magic[8];
    u32 version;
    bool updatable;
    u64 filetime;
    u32 region;
    u32 numentries;
    u32 fs1;
    u32 fs2;
    u8 *zonedata;
} fastfile;

int main(int argc, char **args)
{
    if(!args[1])
        return -1;
    u64 file_size;
    get_file_size(args[1], &file_size);
    u8* file_data = new u8[file_size];
    read_file(args[1], file_data, file_size); //ignore this just reading data

    fastfile* ff = (fastfile *)(file_data + 0); //this is where I setup my struct according to file data
}

有我的结构,这是调试时发生的事情:

http://puu.sh/3e091/1ab766dfc6.png

Hex View:

Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00E7C910  49 57 66 66 75 31 30 30 00 00 01 0D 01 01 CA CC  IWffu100......ÊÌ
00E7C920  3F 53 50 A3 40 00 00 00 02 00 00 00 00 00 03 5B  ?SP£@..........[
00E7C930  78 DA EC 5D 09 7C 13 C5 FE DF A6 94 9B 02 0A 72  xÚì].|.Åþߦ”›..r

你可以看到指向文件时间的指针是0xE7C920而不是0xE7C91D

任何想法如何让我按照我想要的方式工作?或者它会不会这样,因为指针长4个字节?

1 个答案:

答案 0 :(得分:5)

由于填充。现代C实现上的大多数类型都与一个地址对齐,该地址是其大小的倍数。所以在一个结构中,当你有一个char后跟一个uint64_t时,两者之间最多可以有7个填充字节。在你的情况下,u32和bool占用5个字节,因此只需要3个字节来对齐u64。

要便于检测是否存在填充,您可以使用offsetof中的<stddef.h>宏。