-1

私は、C でコードを記述しなければならない圧縮アルゴリズムに取り組んでいます。プログラムはファイルを取得し、すべての文字の最上位ビットを削除し、圧縮されたテキストを別のファイルに保存します。以下に示すように、compressという関数を作成しました。out_buf の解放中にセグ フォールトが発生します。どんな助けでも大喜びです。

4

2 に答える 2

2

out_fd を 2 回閉じるので、もちろん 2 回目は無効なファイル記述子です。しかし、それ以上に、sizeof() の使用を確認する必要があります。これは、動的に割り当てられたバッファーのバッファー サイズを見つけることと同じではありません (sizeof はバッファーではなくポインターのサイズを返します)。呼び出しコードは表示されませんが、渡されたバッファーで strcat() を使用することも常に一見の価値があります (呼び出し元によって渡されたバッファーは結果に対して十分な大きさですか?)。

とにかく、それはあなたを再び元気にするのに十分なはずです...

于 2013-02-21T15:50:34.667 に答える
1

同じファイル記述子を2回閉じています

  close(out_fd);

  if ( close(out_fd) == -1 )
    oops("Error closing output file", "");

最初だけ外すclose(out_fd)

セグメンテーション違反は、out_buf ポインターを移動したことが原因です。彼の malloc 領域内に値を配置する場合は、別の一時ポインターを使用して、このメモリ領域を移動します。

このような:

unsigned char *out_buf = malloc(5400000*7/8);
unsigned char *tmp_buf = out_buf;

次に、すべて*out_buf++*tmp_buf++;で置き換えます。

out_buf書き込み呼び出しの内部も変更しますtmp_buf

于 2013-02-21T15:51:35.520 に答える