1

場合によっては、次のコードが機能します。これは、おそらく良い概念ですが、実行が不十分であることを意味します。これはビットが落ちた場所によってはクラッシュするので、これは私が途中で一歩を踏み出していることを意味します。bufferdataから<=4096バイトで埋めるエレガントな方法を見つけることに興味がありますbufferが、確かに、これはそうではありません。

編集:私が受け取るエラーは、bufferdataへの不正アクセスです

unsigned char        buffer[4096] = {0};
char *bufferdata;

bufferdata = (char*)malloc(4096 * sizeof(*bufferdata));
if (! bufferdata)
    return false;

while( ... )
{

    // int nextBlock( voidp _buffer, unsigned _length );
    read=nextBlock( buffer, 4096);

    if( read > 0 )
    {
        memcpy(bufferdata+bufferdatawrite,buffer,read);

        if(read == 4096) {

            // let's go for another chunk
            bufferdata = (char*)realloc(bufferdata, ( bufferdatawrite + ( 4096 * sizeof(*bufferdata)) ) );
            if (! bufferdata) {
                printf("failed to realloc\n");
                return false;
            }

        }

    }
    else if( read<0 )
    {
        printf("error.\n");
        break;
    }
    else {
        printf("done.\n");
        break;
    }
}


free(bufferdata);
4

2 に答える 2

4

エラーがどこにあるかを判断するのは難しいです。あちこちにいくつかのコードがありません。

if(read == 4096) {犯人のように見えますが、nextBlockが1回の反復で4000を返し、次の反復で97を返した場合はどうなりますか?ここで、4097バイトを格納する必要がありますが、それに対応するためにバッファを再割り当てしません。

バイトを累積し、4096の境界を通過するたびに再割り当てする必要があります。何かのようなもの:

#define CHUNK_SIZE 4096
int total_read = 0;
int buffer_size = CHUNK_SIZE ;
char *bufferdata = malloc(CHUNK_SIZE );
char buffer[CHUNK_SIZE];
while( ... )
{

    // int nextBlock( voidp _buffer, unsigned _length );
    read=nextBlock( buffer, CHUNK_SIZE );

    if( read > 0 )
    {
        total_read += read;
        if(buffer_size < total_read) {
           // let's go for another chunk
            char *tmp_buf;
            tmp_buf= (char*)realloc(bufferdata, buffer_size + CHUNK_SIZE );
            if (! tmp_buf) {
                free(bufferdata);
                printf("failed to realloc\n");
                return false;
            }
            buffer_data = tmp_buf;
            buffer_size += CHUNK_SIZE ;

        }
        memcpy(bufferdata+total_read-read,buffer,read);
      }
      ... 
    }
于 2010-07-01T17:19:34.423 に答える
0

いくつかのコメント:

4096を定義またはconstしてください。これを変更する必要がある場合は、やけどを負います。reallocチェーンは、バッファーを取得するための非常に非効率的な方法です。サイズをプリフェッチして一度にすべて取得する方法はありますか?おそらくそうではないかもしれませんが、realloc()を見ると、私はいつもうんざりします。また、kZipBufferSizeとは何か、残りのカウントと同じようにバイト単位であるかどうかも知りたいです。また、bufferdatawriteとは正確には何ですか?ソースデータだと思いますが、メモリアライメントの問題ではないことを確認するための宣言を確認したいと思います。これは、このような感じです。または、サイズが正しくないためにバッファオーバーランが発生しました。

最後に、nextBlockが何らかの方法でメモリをオーバーランしていないことを確認しますか?これは、コードの潜在的な弱点のもう1つのポイントです。

于 2010-07-01T17:17:45.873 に答える