2017-03-25 25 views
0
'    int main() 
       { 
        int *ptr = (int*)calloc(10,sizeof(int));//allocating memory for 10 integers 
        ptr = realloc(ptr,20*sizeof(int)); //reallocating the memory for 20 integers 
        free(ptr); 
        return 0; 
      }' 

最初ptr保存內存包含零,但新創建的內存包含零或垃圾值。如果我重新分配calloc指針,結果如何?

如果零呈現怎樣才能知道的realloc天氣使用malloc或釋放calloc創建PTR。

+0

代碼不正確。閱讀'realloc'的手冊頁(這也將回答你的問題)。預計你會至少表現出一些努力。 – Olaf

+0

哦,現在這是正確的。時間來更新我的答案:) –

+0

我必須說我發現很難遵循。但由於OP實際上改善了錯字,我很樂意這樣做。 –

回答

3

即使你叫realloc正確像(不含鑄造的結果和分配回來,或者無法正常工作):

ptr = realloc(ptr,20*sizeof(int)); 

(有些人可能說,這是不是安全的,因爲realloc可以返回NULL因此失去了參考ptr

它沒有。它只是重新分配沒有設置其餘0

您可以選擇使用memset例如手動內存的其餘部分設置爲0。

我會做:

int *ptr_new = realloc(ptr,20*sizeof(int)); 
if (ptr_new == NULL) { /* print error, free(ptr) and exit: no more memory */ } 
else 
{ 
    // set the end of memory to 0 
    memset(ptr_new+10,0,sizeof(int)*10); 
    ... 

注意:一個常見的錯誤是分配回realloc的結果,因爲它似乎工作,直至當操作系統需要內存移動到另一點塊,在這種情況下,您的ptr指針變得無效,並且您有未定義的行爲。

+0

以前的指針數據不會「realloc」複製(就像那樣)?在這種情況下,0會持續下去,最多與您之前的金額相同。 –

+1

但是如果我們在ptr中包含一些數據,然後重新分配它,realloc會將數據複製到新的位置,對嗎? –

+1

是的,它們會持續存在,但不會超出先前分配的內存大小。 –