2

ソケットから受信したデータを保存しようとしているときに、ポインターへのポインターを関数に渡して動的に割り当てています。1 つの要求に対しては機能しますが、2 番目の要求では通常、セグ フォールトが発生します。Valgrind の不満: 条件付きのジャンプまたは移動は、応答ポインターを参照する初期化されていない値に依存します。

ポインターを初期化するにはどうすればよいですか、またはこれを安全にするために何ができますか? そして、メイン関数で解放するのは正しいですか?

int main(int argc, char **argv) {
    char * response;
    char readbuf[BUFFSIZE + 1] = "";
    //here I read some data into readbuff which I will send to the server below
    handle_request_data(readbuf, &response);
    //do some stuff with response, send to another socket
    free(response); // can I do that?
}

int handle_request_data(char * readbuf, char ** response) {
    //create tcp socket, connect to it and send readbuf to server

    int recv_total = 0;
    char buffer[BUFFSIZE + 1] = "";
    *response = malloc(BUFFSIZE + 1);
    while ((tmpres = recv(sock_tcp, buffer, BUFFSIZE, 0)) > 0) {

        if (recv_total > 0) {
            //need more memory for buffer
            *response = realloc(*response, BUFFSIZE + recv_total + 1);
        }
        memcpy(*response + recv_total, buffer, tmpres);
        recv_total += tmpres;
    }
}

ご協力ありがとうございました!

4

3 に答える 3

1

1) Q: 関数内で動的に割り当てられたポインタへのポインタを初期化しています

警告: ポインターは関数内で 1 回だけ初期化する必要があります。他の場所で (再) 初期化すると、メモリ リークやその他の大惨事が発生する危険があります。

2) Q: メイン関数で解放するのは正しいですか?

もちろん :)。ただし、同じ注意事項: free it only once . そして、理想的には、解放した後に NULL に設定する習慣を身につけてください。

3) Q: 1 つのリクエストでは検索が機能しますが、2 番目のリクエストでは通常、セグ フォールトが発生します。

私の推測では、コードのどこかでポインターを踏んでいると思います。

Q: 「バッファ」はどこで定義されていますか? recv() でそれを上書きしていない (そして「応答」ポインターを上書きしていない) ことは確かですか?

Q: セグメンテーション違反はどこで発生していますか? デバッガーでコードのその部分をステップ実行できますか?

見つけたものを投稿してください!

于 2013-01-31T23:03:28.483 に答える
0

まず、簡単なもの:

そして、メイン関数で解放するのは正しいですか?

なぜそうしないのですか?とにかく他に何もできませんでした。

2 つ目の難点は、デバッガーを使用してコードのデバッグを試みることです。一見、問題ないように見えますが、わかりません。マルチスレッドを使用していますか?競合状態が存在しないと確信していますか? 等。

于 2013-01-31T22:49:59.687 に答える
0

バッファとは?内部handle_request_dataは定義されていません。グローバル?readbufのことですか?? このパラメーターは使用されません。

于 2013-01-31T22:58:48.220 に答える