使用联合重新解释C中的强制转换/类型双关功能

使用联合重新解释C中的强制转换/类型双关功能,c,unions,reinterpret-cast,mbr,type-punning,C,Unions,Reinterpret Cast,Mbr,Type Punning,我试图将512字节作为无符号字符写入,但将其作为结构中的字段读取。下面是我想出的工会 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

我试图将512字节作为无符号字符写入,但将其作为结构中的字段读取。下面是我想出的工会

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标志时无差异


有人能告诉我我错过了什么吗?

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

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


编辑:另外,请展示您如何向buf写信。如果
a
也为0,则可能存在错误。

哦,对不起。它工作得非常好。显然,b[1]都是零。。我将它与b[0]字段进行比较。对不起,请考虑在@和AdReScript中回答有关填充的信息。这是因为您发布的代码是不可移植的(甚至不能保证在不同的编译器之间),并且可能导致严重的“隐藏”问题。我忘了提到我的结构“part”已经打包。填写
联合
字段并使用另一个字段是未定义的行为。