2016-07-23 71 views
0

我希望收到來自服務器的消息響應,所以我寫了波紋管的功能:錯誤的malloc():內存破壞

char * receive_response(SSL *ssl, BIO *outbio) { 
    int bytes; 
    int received = 0; 
    char *resp; 
    resp = (char *) malloc(4096*sizeof(char)); 
    bytes = SSL_read(ssl, resp, 4096); 
    resp[strlen(resp)] = '\0'; 
    if (bytes < 0) { 
     BIO_printf(outbio, "\nError reading...\n"); 
     exit(1); 
    } 
    received += bytes; 
    BIO_printf(outbio, "Received...%d bytes\n", received); 
    BIO_printf(outbio, "%s", resp); 
    BIO_printf(outbio, "Receive DONE\n"); 
    return resp; 
} 

但我得到的錯誤:的malloc():內存損壞,當我運行它。 奇怪的是,當我在第二次調用main函數時會發生這種情況。第一次沒關係。請幫我理解它。

+1

'memset的( resp,0,sizeof(resp));'是錯誤的......'sizeof(resp)'是一個指針的大小,而不是你分配的塊的大小......儘管它可能並不重要。此外,'strlen()'使用空終止符來確定字符串末尾的位置,所以當null尚未被添加時,您不能使用它。 – Dmitri

+0

對不起,我首先聲明resp爲數組時使用它。我刪了它。而且,strlen(),謝謝你,我的錯誤。但錯誤仍然存​​在。 – thanhdx

+0

爲空終止符分配一個額外的字節(4097個字節,如果您最多讀取4096個字節),並使用'resp [bytes] ='\ 0';'而不是'resp [strlen(resp)] ='\ 0' ;'(在檢查「字節」> = 0之後)。使用'strlen()'找出在哪裏放置空終止符是一個錯誤,因爲如果空終止符還不存在,'strlen()'將不能正常工作。另外,你什麼時候釋放緩衝區? – Dmitri

回答

0

您的字符串尚未終止與'\0',所以你不能在它調用strlen

char * receive_response(SSL *ssl, BIO *outbio) { 
    int bytes; 
    int received = 0; 
    char *resp; 
    // add one extra room if 4096 bytes are effectivly got 
    resp = malloc(4096+1); 
    if (NULL == resp) 
    { 
     perror("malloc"); 
     exit(1); 
    } 
    bytes = SSL_read(ssl, resp, 4096); 
    if (bytes < 0) { 
     BIO_printf(outbio, "\nError reading...\n"); 
     exit(1); 
    } 
    resp[bytes] = '\0'; 
    received += bytes; 
    BIO_printf(outbio, "Received...%d bytes\n", received); 
    BIO_printf(outbio, "%s", resp); 
    BIO_printf(outbio, "Receive DONE\n"); 
    return resp; 
} 

另一種解決辦法是叫calloc,而不是malloc ...

+0

他還需要確保他不會將數據讀入緩衝區的最後一個字節,確保有'\ 0'的空間 – Dmitri

+0

@Dmitri右,更正 – purplepsycho

+0

是的,謝謝大家。 – thanhdx