2013-02-23 43 views
-1

我想写512字节作为无符号字符,但阅读它们作为结构中的字段。下面是我提出的工会。reinterpret_cast /类型双关联功能在C与工会

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标志和/没有区别。

有人可以抛出一些光我失踪了吗?

+0

填写'union'字段并使用另一个是未定义的行为。 – vonbrand 2013-02-24 03:19:29

回答

1

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

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

编辑:另外,请显示你如何写入buf。如果a也是0,那么可能会出现错误。

0

哎呀,对不起。它工作得很好。显然,b [1]全部为零。我将它与b [0]字段进行了比较。道歉。

+0

无论如何,请在@AndreasGrapentin的回答中考虑有关填充的信息。这是因为你发布的代码不是可移植的(甚至不能保证在不同的编译器之间),并且可能导致严重的“隐藏”问题。 – junix 2013-02-23 08:21:12

+0

是的,安德烈亚斯是对的。我忘了提及我的结构“部分”已经打包好了。 – stackoverflow 2013-02-23 22:25:04