-1

次のようなコードがあります。

char buf[128];
char *data = NULL;
char *temp = NULL;

int full = 0;

int n = 0;

do {
     bzero(buf, sizeof(buf));
     n = recv(newsock, buf, sizeof(buf), 0);

     full += sizeof(buf);

     if(n != 0)
          temp = realloc(data, sizeof(buf));

     if(temp != NULL) {
          data = temp;
     } else {
         // error
     }

     memcpy(data + (full - sizeof(buf)), buf, sizeof(buf));

     printf("%s\n",data);
} while(n > 0);

このコードでは、ソケットからバッファにデータを取得し、このデータをメモリに入れようとしています。しかし、私には問題があります。while サイクルの 3 回目の繰り返しで、次のようなメッセージが表示されます。

*** glibc detected *** ./server: realloc(): invalid next size: 0x09a4c008 ***

memcpy() 関数を削除するとすべて問題ありませんが、どうすればデータをメモリに入れることができますか? なにが問題ですか?

4

2 に答える 2

1

問題は、データに追加し続けるが、そのメモリを拡張しないことです。この線

temp = realloc(data, sizeof(buf));

常に 128 バイトを割り当てます。反復ごとにさらに割り当てることを更新する必要があります。たぶん、あなたはこれをインシードするつもりでした:

temp = realloc(data, full);

?

于 2013-09-23T18:55:50.907 に答える