2009-10-25 47 views
14

鑑於這種C代碼編譯用gcc 4.3.3malloc清零內存?

#include <stdio.h> 
#include <stdlib.h> 


int main(int argc, char * argv[]) 
{ 

    int * i; 

    i = (int *) malloc(sizeof(int)); 

    printf("%d\n", *i); 
    return 0; 

} 

我期望的輸出是什麼是在內存中的malloc()返回,而是輸出爲0。malloc的歸零內存它返回?如果是這樣,爲什麼?

+3

這是調試還是發佈? – ChrisF 2009-10-25 21:50:17

+0

你期望的是這種情況。它輸出malloc()返回的內存中的任何內容,它恰好爲零。 – 2011-08-30 14:26:48

回答

30

malloc本身並不會將內存清零,但許多操作系統會將您的程序因安全原因請求的內存歸零(以防止一個進程訪問另一個進程使用的潛在敏感信息)。

+0

謝謝,這給了我一個尋找具體答案的地方! – endeavormac 2009-10-25 21:58:52

+6

我應該提到,標準*中的任何內容都不會使malloc無法清零其內存。爲了效率,它*通常*不會,但這不是強制性的。 – paxdiablo 2009-10-25 22:26:26

+15

另請注意,儘管OS的新內存可能會歸零,但如果您的應用程序回收之前使用的內存,則可能不會將其歸零。所以千萬別想着依靠這個:) – bdonlan 2009-10-25 22:30:43

7

malloc()函數不會將分配的內存設置爲任何特定值。如果您想確保內存爲零,請使用calloc()或同等功能。否則,你會得到之前的任何內容(在你的情況下,可能爲零)。

+0

如果不是一致的,我會期待這樣的結果。爲什麼我會得到一個一直爲0的值,一遍又一遍? – endeavormac 2009-10-25 21:53:21

+2

您以同樣的方式重複運行相同的程序並期待不同的結果?雖然'malloc()'本身不能保證將內存清零,但操作系統正在執行相同的工作來加載程序並將其設置爲正在運行。你的運行時庫代碼做同樣的事情來設置堆內存並開始運行你的代碼。正如另一個答案中提到的,操作系統可能會給你新的內存頁面初始化爲某個特定的值,以隔離不同的進程。 – 2009-10-25 22:07:37

+0

您的程序正在從操作系統請求新的內存。當操作系統第一次分配給進程時,操作系統將會清零內存。嘗試填充隨機值,釋放()該片段,並分配另一個值。 – nos 2009-10-25 22:32:09

1

你絕對不能依靠它0 malloc一個較大的塊並轉儲它看。

1

分配的內存中的值是官方未定義的。 C99狀態:The malloc function allocates space for an object whose size is specified by size and whose value is indeterminate. malloc()可以做任何想要的事情,包括調零。這可能是故意的,實施的副作用,或者你可能只是有很多的記憶,恰好爲0

FWIW在OS X上與蘋果的GCC 4.0.1,我不能讓它出來不是0甚至做了很多分配:

for(idx = 0; idx < 100000; idx++) { 
    i = (int *) malloc(sizeof(int)); 
    printf("%d\n", *i); 
} 
+0

嘗試設置*我非零,釋放我,然後mallocing再看看你得到什麼。 – 2009-10-25 22:50:59

+0

由於安全原因,第一次分配給您的進程的任何內存將設置爲零,以便您不能malloc內存並找出另一個進程寫入的信息。 – gnasher729 2015-01-21 19:04:38

+0

@ gnasher729這可能是一個特定的C編譯器所做的事情,但有*無法保證*這種情況並不應該依賴。 – Schwern 2015-01-21 19:11:53

2

Malloc不必填寫內存。出於性能原因,發行版本通常不會對內存產生任何影響。 「安全」庫可能有一個清除內存的malloc實現。這取決於圖書館的實施者。有一些常見模式通過各種編譯器的調試庫(explained in this stackoverflow topic)填充到內存中。