2012-07-13 54 views
1

可能重複:
Set all bytes of int to (unsigned char)0, guaranteed to represent zero?歸零匿名聯合

我有一個結構裏面以下匿名聯合:

union 
{ 
    unsigned value; 
    char name[4]; 
}; 

我可以將以下代碼:

name[0] = 0; 
name[1] = 0; 
name[2] = 0; 
name[3] = 0; 

用下面的代碼?

value = 0; 
+0

我認爲它歸結爲此 - http://stackoverflow.com/questions/11373203/accessing-inactive-union-member-undefined - 對嗎? – 2012-07-13 11:20:52

+0

@LuchianGrigore no。這是寫作。 – 2012-07-13 11:21:35

+0

@ R.MartinhoFernandes是的,但我假設他後來想要從中讀取,否則就沒有必要進行調零了,對吧? – 2012-07-13 11:22:27

回答

2

在您簡單的情況下,它是相同的,但僅僅是因爲(最有可能)int(和unsignedunsigned int的簡稱)是32位(即四個字節)。如果數組較大,或者只有16位,則不會相同。

0

之間
name[0] = 0; 

name[1] = 0; 

name[2] = 0; 

name[3] = 0; 

其他功能可以改變其他字節。所以,

value = 0; 

更安全,我認爲

1

我覺得這個代碼是更好:

memset(name, 0, max(sizeof(name), sizeof(int))); 
0

是的,但僅限於sizeof(unsigned)==4

+1

或者如果大小是8等....任何東西> = 4. – mah 2012-07-13 11:27:07

1

在C語言中,你最好做

union 
{ 
    char name[sizeof(unsigned)]; 
    unsigned value; 
}; 

現在,一個隱含的初始化,e.g如果初始化周圍struct,你的名字字段始終初始化所有0。並且,如果unsigned沒有填充位(很有可能),則0value的初始化或賦值也將始終爲零,即name

C++的規則是不同的,似乎有從你寫的另一個領域的閱讀是UB。

-1

是的,如果你使用的是64位機器,那就對了。如果不是,您將覆蓋名稱的前2個字符,因爲在32位機器上unsigned的大小是2個字節而不是4個(或更高)。

+0

爲什麼我得到一個downvote? – qwertz 2012-07-14 18:40:47