2015-02-05 22 views
0

我實現了一個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函數中有一些未定義的行爲,但我真的不知道問題出在哪裏。任何人都可以給我一些提示嗎?謝謝!

**問題解決了,所以源代碼已被刪除。

+1

使用realloc並逐字節遞增大小是緩慢的,導致二次行爲。一般的技巧是在每次需要更多空間時將分配的大小加倍(除了'加空'之外)。您也可以縮小超大的分配以符合確切的要求。這不是,直接與您的問題/錯誤相關。 – 2015-02-05 22:58:50

+1

編譯器應該警告你'可能在這個函數中使用變量'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

+0

'while(read(fd,&c,1)!= 0)'read可以返回-1(其作用爲'true')...只是說... – wildplasser 2015-02-06 01:43:55

回答

4

您在createQuery()中分配的緩衝區太小。

計算的長度不包含HTTP_VERSION,也不包含終止的\ 0字節。結果是內存損壞,以及未定義的行爲。

+0

謝謝,你是救命恩人! – TonyLic 2015-02-06 00:57:15