2012-03-21 129 views
0

我想重新分配更多的256字節緩衝區在每個循環調用。在這個緩衝區中,我將存儲從read()獲得的緩衝區。realloc()循環中的段錯誤

這裏是我的代碼:

#define MAX_BUFFER_SIZE 256 
//.... 
int sockfd = socket(...); 

char *buffer; 
buffer = malloc(MAX_BUFFER_SIZE); 
assert(NULL != buffer); 
char *tbuf = malloc(MAX_BUFFER_SIZE); 
char *p = buffer; 
int size = MAX_BUFFER_SIZE; 

while(read(sockfd, tbuf, MAX_BUFFER_SIZE) > 0) { 
    while(*tbuf) *p++ = *tbuf++; 
    size = size + MAX_BUFFER_SIZE; // it is the right size for it? 
    buffer = realloc(buffer, size); 
    assert(NULL != buffer); 
} 


printf("%s", buffer); 
free(tbuf); 
free(p); 
free(buffer); 
close(sockfd); 

但上面的代碼返回段故障。我錯在哪裏?任何幫助非常感謝。提前致謝。

+2

'while(* tbuf)* p ++ = * tbuf ++;'您正在增加tBuf,它是malloc(0)d。你永遠無法釋放它,因爲你失去了原來的指針。提示:使用'memcpy(p,tbuf,return_from_read);'while(* tbuf)'假設一個nul結尾的字符串。 – wildplasser 2012-03-21 19:49:36

回答

2

這些是對我來說是顯而易見的問題:

  • realloc可以修改位置,它是buffer點。但是,您無法相應地修改p,並且它將指向上一個緩衝區。這顯然是一個錯誤。
  • 我看到潛在的另一個錯誤,因爲while循環不需要終止,並可能運行緩衝區的末尾。這是分段錯誤的最可能原因。
  • 您使用realloc的方式是錯誤的。如果realloc的調用失敗,則不能再使用原始緩衝區的free。您應該將返回值realloc分配給一個臨時變量並在覆蓋buffer變量之前檢查錯誤。
  • 您不應該在指針p上撥打free。由於這是爲了指向buffer所擁有的區塊,您只需撥打buffer即可撥打free
2

事情是read不添加0終止符。所以,你的內心while無疑是步進分配的內存外:

while(*tbuf) *p++ = *tbuf++; 

的另一個問題是,你是釋放您沒有通過的malloc得到的東西。當你免費打電話時,你會增加ptbuff你試圖釋放。

整個buffer分配的東西看起來沒用,因爲你實際上並沒有在任何地方使用它。

2

當您使用reallocbuffer,有可能的buffer地址改變爲改變大小的結果。一旦發生這種情況,p不再保存正確的地址。

同樣在最後,當他們指向相同的位置時,您可以釋放pbuffer。你只應該釋放其中一個。