2016-07-23 21 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関数を()。 奇妙なことは、メインで2回目にこの関数を呼び出すと発生します。最初は大丈夫です。それを理解するのを助けてください。

+1

'memsetの( resp、0、sizeof(resp)); '間違っています...' sizeof(resp) 'はあなたが割り当てたブロックのサイズではなくポインタのサイズです。また、 'strlen()'はヌルターミネータを使用して文字列の終わりを判断します。ヌルがまだ追加されていない場合は使用できません。 – Dmitri

+0

申し訳ありませんが、最初に配列としてrespを宣言するときに使用します。私はそれを削除しました。そして、strlen()、ありがとう、私の間違い。しかし、まだエラーが発生します。 – thanhdx

+0

は[バイト] = '\ 0'(あなたが4096まで読めば、4097バイト)をNULL終端のための余分なバイトを割り当て、そして 'RESPを使用;'代わりRESP 'の[strlenを(それぞれ)] = '\ 0' ; '(' bytes'が> = 0であることを確認した後)。 'strlen()'はヌルターミネータがどこにいなくても正しく動作しないため、 'strlen()'を使ってヌルターミネータをどこに置くかを理解するのはエラーです。また、いつバッファを解放しますか? – Dmitri

答えて

0

あなたがそれにstrlenを呼び出すことはできませんので、あなたの文字列がまだ、'\0'で終了していない:

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; 
} 

別の解決策ではなくmalloccallocと呼ばすることができ...

+0

彼はまた、彼は、バッファの最後のバイトにデータを読み取らないことを確認する必要があり、基本的なクライアント「\ 0」の余地があることを確認してください。 – Dmitri

+0

@ドミトリー権利 – purplepsycho

+0

訂正ありがとうございます。 – thanhdx

関連する問題