2014-07-07 21 views
0

我使用兩種方法來創建數組。我曾經認爲他們是一樣的,但看起來不一樣。爲什麼在未初始化的數組中有一些奇怪的數字?

char *buffer=malloc((sizeof(char)*100)); 
    char buffer1[100]; 
    strcpy(buffer,"Eric"); 
    strcpy(buffer1,"Eric"); 
for (int i=0; i<100; i++) { 
    printf("%c",buffer[i]); 
} 
    printf("\n"); 
for (int i=0; i<100; i++) { 
    printf("%c",buffer1[i]); 
} 

結果是

Eric 
Eric?!^?{"Gl?(?!^?(?!^[email protected]?!^?0?P?!^? 

我檢查陣列然後我發現有該陣列中一些奇怪的數字。但是爲什麼當我使用malloc創建數組時。奇怪的數字不存在?

+1

「未初始化」並不意味着「設置爲一些衆所周知的默認值」。這意味着它可以包含任何東西(當然,在內存字節可以包含的限制內,至少......)。 – twalberg

回答

3

顯然,系統上的malloc正在清除返回的內存。這可以防止數據從一個進程泄漏到另一個進程,或者幫助進行調試。或者您可能已經很幸運了,下一次malloc不會清除內存,例如,因爲它來自已經在您的進程本地的池。所以,不要指望它。 calloc可用於此目的。

第二種機制只是調整堆棧指針。無論在輸入函數之前堆棧中的任何內容仍然存在。清除它會花費時間,所以C編譯器不會生成代碼來執行此操作。