2013-02-22 27 views
2

當我們使用memset時,我們將它設置爲零。爲什麼我們需要memset始終爲零?

爲什麼?爲什麼不與1或2或別的東西。

此外,結構設置爲0,似乎工作,但設置爲1不會:如果我使用1

typedef struct abc{ 
    int a; 
} abc; 

int main() 
{ 
    abc* ab; 
    memset(ab, 0, sizeof(abc));// it sets abc->a = 0; correct 
} 

但是,相反的0

memset(ab, 1, sizeof(abc)); 

那麼的價值abc->a = garbagenot equals to 1

爲什麼?

+1

因爲'memset'將所有**字節**設置爲指定值,而不是整個整數。 – sgarizvi 2013-02-22 06:57:37

+1

你的程序永遠不會分配指針'ab'的目的地。該程序是未定義的行爲(但這並不一定是'ab-> a'不是其中的原因)。 – 2013-02-22 06:57:41

+0

,因爲0是初始值。 – 2013-02-22 07:00:16

回答

11

你並不總是需要memset爲0,這僅僅是做最普通的(和有用)的事情。

memset將每個字節設置爲某個給定值。一個int由4個字節,因此,當memset荷蘭國際集團到1,你會設置每個那些4至1,那麼你就必須00000001 | 00000001 | 00000001 | 00000001 = 16843009 (第一數字是二進制,最後以十進制表示)。

另外 - 請注意,你永遠不會爲ab分配內存。即使您的代碼現在可以工作,但這並不安全。這將是:

abc ab; 
memset(&ab, 0, sizeof(abc)); 
1

如程序中所示當定義變量時,默認情況下它將指向任何位置,並且任何垃圾數據都可以先前在那裏可用。

我們通常將memset設置爲(0)零以確保變量初始化爲零,以便稍後在程序中我們可以相信分配給該變量的值是真正分配的值,而不是任何垃圾。

希望它可以幫助.....

+0

爲什麼只用'0'?爲什麼不與其他任何價值? – 2013-02-22 07:05:48

+0

Cuz「0」是設置任何內容的最常見值。現在假設,您將值設置爲「3」。現在,相同的結構被其他人編寫的任何其他應用程序讀取。現在他會認爲ab-> a = 3是一個有效值,並將用它來進一步處理數據。但是如果你發送ab-> a = 0,他會知道你的結構沒有攜帶任何有效的數據,並且會停止執行。 – Abhineet 2013-02-22 07:13:56

+0

因爲我們都知道零表示什麼都沒有(空)。這就是爲什麼。 如果您想使用它進行比較,您可以嘗試使用1,2到255的任何值。但是你應該知道memset適用於所有字節。 例如在你的情況下,結構體的int爲成員,並假設int爲4字節,它將爲所有4個字節分配1,所以當你打印這個值時,你將不會得到1,但得到的是小數4369或0x1111。所以要小心。 – 2013-02-22 07:15:11

2

memset()使用內存設置的值取決於你的需求。就這樣。沒有人阻止你使用任何其他值來初始化內存。

1

首先你的程序得到了一個未定義的行爲,這個reaosn是abc * ab的內存;永遠不會分配!

其次要求字符串應該以「null」結尾,這意味着它是結束的,所以受此啓發,我們在memset中使用null。但你可以使用任何你想要的值...

+0

談論'零'而不是'null'將會不那麼模糊 – alk 2013-02-22 07:10:38

2

正如其他人所提到的,0在很大程度上是任意的。但是,如果我們不得不選擇的原因,這是爲了方便(在安全的成本 - 你應該更喜歡明確初始化的變量,如果你曾經依賴於它們):

  • 0大多理解爲整數的初始值,符號或無符號的,因爲它代表0不管寬度或端序
  • 0是結束字符串char*小號
  • 0是常0.0浮點數
  • 0是常NULL在C,保證在C++中爲NULL
+0

0如何確保將浮點變量設置爲0.0?語言的哪個部分標準保證? – 2013-02-22 07:19:23

+1

@AlexeyFrunze:除語言標準外還有其他標準,其中一些標準更爲普遍。 – 2013-02-22 07:24:30

+0

@BenjaminLindley所以,您同意語言標準並不保證0.0代表wi所有零位? – 2013-02-22 07:31:38