1

私はリングバッファを実装しています.1つの方法でCHUNKSIZEは、ループ内のファイルからバイトを読み取り、ポインタをリングバッファに挿入しています。

私はwhileループでこれをやっています。コードは問題mallocなく動作callocしますが、ループの最後で segfault が発生します。これは本当に謎です。

コードは次のとおりです。

fpos_t position = 0;
fpos_t file_size = 0;
fseek(file, 0L, SEEK_END);
fgetpos(file,&file_size);
fseek(file, 0L, SEEK_SET);
char* b = calloc(CHUNKSIZE,sizeof(char));
// char* b = malloc(sizeof(char)*CHUNKSIZE);
while(fread(b,1,CHUNKSIZE,file)){
    deposit(reader_buf,b);
    // This always changes the cursor position by -150 to create overlapping chunks
    fseek(file,-150,SEEK_CUR);
    b = calloc(CHUNKSIZE,sizeof(char));
    // b = malloc(sizeof(char)*CHUNKSIZE);
}
4

2 に答える 2

2

mallocとの唯一の違いはcalloccallocメモリを 0 に初期化し、malloc初期化しないことです。

したがって、バグは、によって 0 で上書きされたデータのどこかにアクセスしている可能性がありますcallocbバッファのライフサイクル、またはその他の動的に割り当てられたデータを確認することをお勧めします。

于 2012-12-21T13:17:56.893 に答える
1

おそらく、mallocセグメンテーション違反ではなく、そうではありcallocません。これを証明するにputs( "allocated memory" );は、malloc-or-calloc 行の後に診断を追加して、もう一度試してください。ループの直後にもう 1 つスローします。これは、問題を引き起こしているのは関数自体の選択ではないことを証明するはずです。

valgrindなどのランタイム メモリ デバッガーを使用してみてください。プログラムを初めて実行したときに問題が見つかったとしても、私は驚かないでしょう。また、Alexandru C. が示唆するようにゼロ化されたメモリに依存していたことが判明しても驚かないでしょう。

于 2012-12-21T13:55:33.813 に答える