2011-12-18 82 views
10

一般情況下,按照C標準,它保證memset()爲0會將C結構中的填充位清零。是否保證memset會將結構中的填充位清零?

gcc呢?

例如,是這樣的:

struct MyStruct 
{ 
    unsigned char member1; 
    unsigned int member2; 
    char  member3; 
    unsigned char member4; 
    float  member5;  
}; 

struct MyStruct ms; 

memset(&ms, 0, sizeof(struct MyStruct)); 
+0

你能告訴我們一個代碼示例嗎? – Mysticial 2011-12-18 04:27:30

+0

添加代碼示例 – 2011-12-18 04:32:57

+2

我不明白是什麼讓你懷疑。 – 2011-12-18 04:33:46

回答

15

也許值得一提的是,memset不知道你的結構(或陣列,或原始,或任何東西大塊記憶,無論你發生什麼),所以即使它想保持填充位完整,它甚至不知道它們在哪裏。

11

是,memset寫入一個32位值到的給定長度的存儲器中,起始給定的地址的連續區域。在你的情況下,memset寫入區域(32位值)0

所以,如果你長sizeof (your_struct)memset,你應該罰款:

memset(&ms, 0, sizeof(struct MyStruct)); 
8

如果重要,你可能會做一些不安全和不可移植的事情。

是的,memset調用會將任何填充位(或字節)設置爲0--但不能保證在語言中將對象設置爲all-bits-zero將設置爲0.0。這同樣適用於指針:all-bits-zero不保證是空指針。 (在這兩種情況下,對於大多數實現來說都是如此)。

最初的ISO C90或C99標準甚至不保證all-bits-zero是整數類型的有效表示0; C99之後的技術勘誤之一增加了這樣的保證(僅適用於整數類型)。

爲便於攜帶,如果您希望某些東西爲零,請明確設置它。您還可以利用初始化程序中靜態對象和省略成員的零值初始化。

一個術語nitpick:「填充位」是整數類型表示的一部分(通常沒有它們)。結構成員之間的填充是填充字節