我實現了一個HTTP客戶端,它可以通過指定主機名和端口並從套接字逐行顯示它來接收內容。下面是我讀一個線功能:按行讀取插槽,但發生存儲器問題
char* getLine(int fd)//fd is the socket number created before
{
char c, pre;
char* line = 0;
int size = 0;
while(read(fd, &c, 1)!=0)
{
line = realloc(line, ++size);//read a new char so re-allocation
line[size - 1] = c;
if(pre == '\r' && c == '\n')//this is a new line
{
break;
}
pre = c;
}
if(line)
{
line = realloc(line, ++size);
line[size - 1] = 0;//add a \0 at the end of line
}
return line;
}
下面是我在主函數中使用此功能(假設的sockfd已創建並請求已發送到服務器)
char* line;
while((line = getLine(sockfd)) != NULL)
{
printf("%s", line);
if(!strcmp(line, "\r\n"))//blank line
printf("#####Now reading body.\n");
free(line);
}
的問題是,當我嘗試從google.com或yahoo.com等簡短頁面獲取內容時,它可以正常工作。但是,如果我想嘗試一些長頁面,例如www.stanford.edu,則顯示realloc(): invalid next size: 0x0000000000c794b0 ***
。
看起來好像我的指針在getLine
函數中有一些未定義的行爲,但我真的不知道問題出在哪裏。任何人都可以給我一些提示嗎?謝謝!
**問題解決了,所以源代碼已被刪除。
使用realloc並逐字節遞增大小是緩慢的,導致二次行爲。一般的技巧是在每次需要更多空間時將分配的大小加倍(除了'加空'之外)。您也可以縮小超大的分配以符合確切的要求。這不是,直接與您的問題/錯誤相關。 – 2015-02-05 22:58:50
編譯器應該警告你'可能在這個函數中使用變量'pre'未初始化';將其初始化爲0.您應該檢查'realloc()'是否返回失敗 - 空指針。此外,如果是這樣,則會因爲丟失了以前的非空指針而泄漏內存。總是在'void * new_space = realloc(old_space,new_size); if(new_space!= 0)old_space = new_space;'。 – 2015-02-05 23:02:06
'while(read(fd,&c,1)!= 0)'read可以返回-1(其作用爲'true')...只是說... – wildplasser 2015-02-06 01:43:55