2011-09-18 65 views
2

我試圖運行下面的代碼:我只是幸運malloc返回了一個零填充緩衝區?

int main(){ 
char *ptr = (char*)malloc(sizeof(char)*20); 
ptr[5] = 'W'; 
ptr[0] = 'H'; 
std::cout<<ptr<<std::endl; 
return 0; 
} 

當我使用GCC 4.3.4,我得到「H」作爲輸出。由Kernighan的&裏奇這本書C程序設計語言說的malloc()返回未初始化的空間,在這種情況下,輸出應該已經有了一些明確的值。我的輸出結果是ptr [1]爲'\ 0'的巧合嗎?

+0

[This](http://stackoverflow.com/questions/7421502/instead-of-just-using-free-and-having-the-pointer-pointing-some-new-block-how/7421564#7421564 )可能是一個很好的解讀。 –

+0

根據定義,'sizeof(char)'總是'1'。 – fredoverflow

回答

3

是的,這只是一個巧合。不要依賴它。

0

是。但在術語中要小心,ptr [1]是int 0,不是指針。在調試編譯

+0

感謝您糾正我。空終止是我猜測的正確詞。 –

1

它的平臺(和編譯模式)相關的,例如可能會充滿了某種模式,如0x55的和0xAA 0x55的,在生產中你可能會爲0x00-S,或任何記憶的垃圾。 所以是的,你可能會宣稱它是一個巧合。 因爲字符串並不總是被終止,所以你可能很容易遇到總線錯誤(或無效的存儲器訪問)。

2

這可能是巧合,也可能是您的特定系統的內存分配器的一個特點,這肯定不是一個語言或庫要求初始化動態分配的內存。

不要混淆非確定性隨機,即使內存未初始化,該字節爲零的機率可能遠遠大於1/256更大,由於典型的內存使用模式。例如在調試器打開一個內存窗口ptr並通過任一方向相鄰的存儲滾動,你很可能會看到爲零,而很多。

相關問題