2013-05-28 60 views
1

我想要一個二進制文件的記錄大小的身材更小。 sizeof運算(union_data)如何可以比聯盟中的兩個數據結構更小?聯盟尺寸比總成員

例如

struct hdr 
{ 
    unsigned short hdr; 
    char  hdr_name [90]; 
    char  hdr_add1 [90]; 
    char  hdr_add2 [90]; 

}; 

struct data_info 
{ 

    unsigned short no; 
    char  name   [90]; 
    char  addr1   [90]; 
    char  addr2   [90]; 
    char  amount    [120]; 
    char  verb  [25]; 

}; 

union 
{ 

    struct box_info_data box_buff; 
    struct hdr dhdr; 
    struct data_info dinfo; 

} dhdr_rec, ddata_rec; 
+1

有沒有'union_data'在你的代碼。我假設你的意思是'sizeof(dhdr_rec)'?你也知道'union'是如何工作的嗎?它的大小至少等於其最大成員的大小,並且它的所有成員共享的空間,使得只有*其中之一*可以是「有效」的時間。對比與一個'struct',其大小至少等於它的構成部件的大小的總和的該行爲。 –

+6

這將是最大成員的大小,再加上可能一些填充取決於編譯器和編譯選項。你期望它是成員大小的總和嗎?如果是這樣,我認爲你不瞭解工會如何工作。 –

+2

在這一點上,你沒有顯示任何錯誤。是什麼讓你認爲*「sizeof(union_data)小於union內的兩個數據結構」*?給我們一些工作在這裏! – dmckee

回答

3

谷歌上搜索了一下,(只是找工會c)中,你會發現,在第一篇文章:

聯合是在C語言中一個特殊的數據類型,使您可以存儲不同數據類型在同一個內存位置。

所以,你的聯盟將使用盡可能多的內存最大的三個結構你裏面已經,不是所有三個總和。

更多信息,可以發現here

+1

它會使用*至少*那麼多的內存。如果需要填充,它可能會使用更多。 –

+0

@KeithThompson,完全同意,取決於編譯器和編譯器選項,它可能會添加一些填充。恕我直言,與這個問題無關,只會導致更多的誤解。畢竟,在一個有千兆字節RAM的計算機的世界裏,爲什麼要用幾個字節來打擾他呢?讓他先學習第一件事......再次,只是我的意見:) – Ishmar