0

私のネットワーキングクラスでは、UDPプロトコルに基づいてビットトレントクライアントを構築しています。これはかなりクールですが、何らかの理由でC文字列に多くの問題があります。

初めてパケットを受信するときは、次のようにします。

if(server_data == NULL){
    server_data = malloc(one_block.total_blocks*sizeof(char*));
    int i;
    for(i = 0; i < one_block.total_blocks; i++){
        server_data[i] = malloc(sizeof(char*));
        server_data[i] = "";
    }
}

ここで、server_dataはaでchar**あり、one_blockはstructパケット情報とペイロードを保持します。

次に私はします:

server_data[one_block.which_block] = one_block.payload;
blocks_rcv++;
if(blocks_rcv == one_block.total_blocks-1)
    done = TRUE; //macro
if(done){
    int i;
    for(i = 0; i < one_block.total_blocks; i++){
        printf("%s", server_data[i];
    }
}

すべてが順調でダンディに見えますが、すべてのパケットが受信される前にserver_dataの内容を印刷すると、なんらかの理由で、各パケットから異なるデータが表示されます。その後、done = TRUEを設定し、そのforループに入ると、配列内のすべてのスポットに同じ文字列値が含まれます。

なぜこれが起こっているのかわかりません。投稿の最初から最後まで、配列の内容がどのように変化するかを本当に理解したいと思います。時間。

4

2 に答える 2

3

この行が問題です:

server_data[i] = "";

割り当てられたポインタを文字列リテラルへのポインタで上書きしますまた、文字列リテラルは変更できないため、後でこのポインタにコピーすると、未定義の動作が発生します。

文字列が空であることを確認する場合は、を使用するかcalloc、最初の文字をに設定するか、を'\0'使用して新しい文字列strcpyコピーします。

于 2013-02-21T05:27:13.893 に答える
0

ここで起こっている問題がいくつかあります:

1)まず、server_dataは、char **として宣言されている場合、宣言しない限り、nullになる場合とnullにならない場合があります。NULLに初期化したかどうかはわかりません。明示的にNULLに初期化することをお勧めします。

2)配列server_dataの各項目がchar *(つまり、文字列への参照)を保持するのか、配列自体が文字列になるのか、何が起こっているのかわかりません。one_block.payloadは文字列ですか、それとも文字列へのポインタのセットですか?

いくつかのテスト値を使用してコードを実行しましたが、個人的に予期しない値で問題が発生することはありません...問題は、ペイロードデータを保持する構造体の設定方法にあると思います。one_block構造体を見せていただけますか?one_block.payloadはどのタイプの変数/配列ですか?

于 2013-02-21T07:48:35.920 に答える