2012-06-21 119 views
1

我想使用realloc函數來存儲動態數組中的輸入字符。一切都很順利,當我使用它時,沒有調用免費方法釋放內存使用後。但是,當我使用它免費的方法運行時錯誤來了。這是我的代碼片段。Realloc免費使用

int main(){ 
char *message ; 
int len = 0 ; 
char c ; 
while((c=getchar()) != '\n'){ 
    message = realloc(message,(len+1)*sizeof(char)) ; 
    message[len++] = c ; 
}  
message = realloc(message, (len+1)* sizeof(char)); 
message[len]='\0' ; 
printf("Message is %s\n",message); 
free(message) ; 
return 0 ; 
} 

任何人都可以弄清楚這一點。因爲我需要同時使用這兩種方法.. 謝謝!

+0

請發佈收到的錯誤。 – Linuxios

+0

我得到這個錯誤*** glibc檢測到*** ./reallocdemo:realloc():無效指針:0x00d5cff4 *** ======= Backtrace:========= /lib/i386-linux-gnu/libc.so.6(+ 0x6b961)[0xc6b961] /lib/i386-linux-gnu/libc.so.6(realloc+0x2ad)[0xc7073d] /lib/i386-linux -gnu/libc.so.6(realloc + 0x2c5)[0xc70755] ./reallocdemo[0x80484b6] /lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0xc16e37] ./reallocdemo [0x8048401] – user976754

+1

消息未初始化。在調用realloc之前,至少可以將它設置爲null。 – wildplasser

回答

1

雖然它可能不會導致你看到的問題,X = realloc(X, newsize);是一個等待爆炸的時間炸彈。 realloc可以返回一個空指針,如果它未能分配您請求的新塊,則保留現有數據不變。當/如果它這樣做,這將覆蓋現有的指針與NULL,泄漏您先前分配的內存(和未能分配更多)。

雖然它可能也不造成問題的原因,我也建議(強烈)反對使用realloc增加你分配一次一個字符。這是非常低效的。我從一個32或64個字符的塊開始,每當空間用完時增加一些因子(比如1.5)。通過這種方式,您可以處理大量不同的輸入長度,而無需大量調用realloc。

編輯:看着它,真正的問題可能是您在初始化realloc之前沒有正確初始化您的指針。如果你傳遞的不是NULL指針,而是期望你傳遞的是從malloc/calloc或之前調用realloc得到的有效指針。

int main(){ 
char *message ; 
int len = 0 ; 
char c ; 
while((c=getchar()) != '\n'){ 
    message = realloc(message,(len+1)*sizeof(char)) ; 
    message[len++] = c ; 
}  
message = realloc(message, (len+1)* sizeof(char)); 
message[len]='\0' ; 
printf("Message is %s\n",message); 
free(message) ; 
return 0 ; 
} 

至少對我而言,這個運行沒有任何錯誤信息。

+0

嗨,傑裏!是的,我確定我會用它來分配內存由以前分配的內存的一些因素。但在這裏,我只是檢查它使用realloc和免費在一起,這會導致問題.. – user976754

+0

是的,你是對的傑瑞。初始化解決了這個問題.. – user976754

+0

我認爲這不好。首先,你給出了一個不屬於評論的非答案,而不是關注真正的問題。然後你改變這個答案。 –