使用联合重新解释C中的强制转换/类型双关功能
我试图将512字节作为无符号字符写入,但将其作为结构中的字段读取。下面是我想出的工会使用联合重新解释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
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”已经打包。填写联合
字段并使用另一个字段是未定义的行为。