2013-02-23 48 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