使用联合在C中重新解释_cast /类型惩罚功能

时间:2013-02-23 07:40:10

标签: c unions reinterpret-cast mbr type-punning

我试图将512字节写为unsigned char,但将它们作为结构中的字段读取。以下是我提出的工会。

typedef union {
    unsigned char buffer[512]; //512 bytes
    struct {
            unsigned char a[446];
            struct part b[4]; //sizeof(part) = 16
            unsigned char c[2];
    }parsed; //446 + 4*16 + 2 = 512 bytes
}tbl;

我可以正确写入缓冲区,但是从a或b或c读取0。 - 我正在使用gcc - 在64位Linux机器上 - 没有-m32标志没有区别。

有人可以把我失踪的东西弄清楚吗?

2 个答案:

答案 0 :(得分:1)

你真的不应该这样做。最有可能的是,由于对齐问题,您的结构大于512字节。或者,换句话说,编译器在结构字段之间放置空格。

如果您想避免性能损失,请查看#pragma pack指令。也许你的编译器支持它。

编辑:另外,请说明你如何写信给buf。如果a也为0,那么您可能会遇到错误。

答案 1 :(得分:0)

哎呀,抱歉。它工作得很好。显然,b [1]都是零...我将它与b [0]字段进行比较。道歉。