我希望收到來自服務器的消息響應,所以我寫了波紋管的功能:錯誤的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函數時會發生這種情況。第一次沒關係。請幫我理解它。
'memset的( resp,0,sizeof(resp));'是錯誤的......'sizeof(resp)'是一個指針的大小,而不是你分配的塊的大小......儘管它可能並不重要。此外,'strlen()'使用空終止符來確定字符串末尾的位置,所以當null尚未被添加時,您不能使用它。 – Dmitri
對不起,我首先聲明resp爲數組時使用它。我刪了它。而且,strlen(),謝謝你,我的錯誤。但錯誤仍然存在。 – thanhdx
爲空終止符分配一個額外的字節(4097個字節,如果您最多讀取4096個字節),並使用'resp [bytes] ='\ 0';'而不是'resp [strlen(resp)] ='\ 0' ;'(在檢查「字節」> = 0之後)。使用'strlen()'找出在哪裏放置空終止符是一個錯誤,因爲如果空終止符還不存在,'strlen()'將不能正常工作。另外,你什麼時候釋放緩衝區? – Dmitri