2010-02-06 36 views
9

我正在關注這個tutorialhttp://theocacao.com/document.page/234)。我對這段感到困惑,主要是與calloc有關的幾行:有關calloc vs malloc的C教程問題

我們也可以使用malloc函數的一個變種,叫做calloc。 calloc函數有兩個參數,一個值計數和基值大小。 它還清除內存返回一個指針,這是避免在某些情況下不可預知的行爲和崩潰的有用前:

最後一行混淆了我。清除記憶是什麼意思?

回答

20

函數calloc將確保返回的存儲器中的所有字節都設置爲0. malloc不作任何保證。它返回的數據可能並將包含看似隨機的數據。

該區別對數據成員的初始化非常有用。如果0是一個結構中所有值的默認值,那麼calloc可以簡化結構創建。

Foo* pFoo = calloc(1, sizeof(Foo)); 

Foo* pFoo = malloc(sizeof(Foo)); 
pFoo->Value1 = 0; 
pFoo->Value2 = 0; 

空檢查爲了清楚而省略。

+0

...結果是,如果*你*沒有正確地初始化內存,你會得到不可預知的結果。 – dmckee 2010-02-06 19:42:21

+0

如果你也要使用'realloc()',你必須處理額外內存沒有歸零的事實 - 所以你可能需要你的初始化代碼來完成這個工作(足夠的)。顯然,如果你使用'calloc()'這個內存,並且永遠不會'realloc()',那麼這個沒關係。 – 2010-02-06 19:52:21

+1

「將包含看似隨機數據」 - 對於「隨機」的某些值。統計測試很可能能夠區分它與連續樣本均勻分佈的離散隨機變量,範圍爲0 ... UCHAR_MAX ;-) – 2010-02-07 01:27:02

7

爲了準確:

這在避免 某些情況下

不可預測的行爲和崩潰有用

改爲:

其中在隱藏 不可預知的是有用行爲和崩潰 某些情況下

4

「清除內存」在這種情況下意味着填充物理全零位模式。請注意,從形式上看,這種原始內存初始化只能保證與整型類型一起工作。即整型的對象保證接收初始值爲零。是否有任何其他類型將被有意義地初始化,這是實現定義的。 (它需要額外的標準超出C標準的限制以提供額外的保證POSIX,IEEE 754等)

是否使用calloc來「防止崩潰」,如引用中所述實際上是有道理的是一個不同的問題。我會說,它確實可以提高懶惰程序員編寫的代碼的穩定性,因爲它會將由各種垃圾值觸發的所有可能的意外行爲都摺疊成由全零值觸發的特定意外行爲。