2

CI でページの html を読み込もうとしていますが、データを保持しているバッファを動的にしたいと考えています。ループとを使用してこれを行う必要があることはわかっていますが、reallocそれをどのように行うかはよくわかりません。sockソケット ( ) が既に開いていると仮定すると、次のことを考慮してください。

char *buffer = ???, *tmp;  //just my guess I'm fairly certain buffer cannot be NULL considering my recv loop...
int q = 0, c;
int i = 1;       //buffer size

    while(q < i)
{
    c == recv(sock, buffer + q, i - q, 0);
    if(c == SOCKET_ERROR) break;
    i += c;
    tmp = realloc(buffer, i * sizeof(char));
    //if(!tmp) /*not important right now I can add error handling later*/;
    buffer = tmp;      
    q += c;
}

これは私の目標を達成する方法についての私の最善の推測ですが、これが機能するかどうかは非常に疑わしく、洞察または修正が必要です.

4

1 に答える 1

4

コード内のいくつかの悪いエラー:

c == recv(...

==代入ではなく比較です。 または のいずれかが得られ0ます1。それで:

tmp = realloc(buffer, i * sizeof(char));

sizeof(char)1定義によるものであり、戻り値を に対してチェックする必要がありますNULL。また、変数に意味のある名前を付けてください。これにより、後で多くの手間が省けます。

今、あなたは「事後割り当て」のようなことをしようとしています - バッファに読み込んでから、それをちょうど得たサイズに拡張します - 一種の後方です。

簡単な解決策 (多くのうちの 1 つ):

  • 前もってバッファを割り当て、
  • 蓄積されたサイズ (したがってオフセット) を追跡するループで読み込まれます。
  • バッファ スペースが不足している場合は、以前のサイズの2 倍のサイズに再割り当てして続行します。

これはほとんどの場合TMで機能します。反対側がデータを供給し続ける場合に、すべてのメモリをむさぼり食わないように、いくつかの健全性チェックを追加することをお勧めします。

お役に立てれば。

于 2012-08-15T15:35:26.910 に答える