ファイルから文字を1行ずつ読み込み、その文字を文字列に配置しようとしています。ここに私のコード:ファイルから行を読み取るとクラッシュする
realloc
行でプログラムがクラッシュします。私がその行をループの外に移動したりコメントアウトしたりすると、クラッシュすることはありません。文字を読み込んで標準出力に送るだけであれば、すべて正常に動作します(つまり、ファイルが正しく開かれています)。問題はどこですか?
ファイルから文字を1行ずつ読み込み、その文字を文字列に配置しようとしています。ここに私のコード:ファイルから行を読み取るとクラッシュする
realloc
行でプログラムがクラッシュします。私がその行をループの外に移動したりコメントアウトしたりすると、クラッシュすることはありません。文字を読み込んで標準出力に送るだけであれば、すべて正常に動作します(つまり、ファイルが正しく開かれています)。問題はどこですか?
最初にmalloc
で生成されなかったポインタはrealloc
できません。
また、オフに1つのエラーがあり、問題が発生する可能性があります。
realloc
文字列リテラルは使用できません。また、すべての新しいcharを入力することは、これを行う効率的な方法ではありません。 gnuの拡張子はgetline
です。
:あなたがいないmalloc
か、許可されていないrealloc
のいずれかで割り当てられたメモリへのポインタでrealloc
を呼んでいたので、
char *str = NULL; // realloc can be called with NULL
size_t len = 1; /* I also count the terminating character */
char temp;
while ((temp = getc(file)) != EOF)
{
str = (char *)realloc(str, ++len * sizeof(char));
str[len-2] = temp;
str[len-1] = '\0';
}
あなたの問題があります。 realloc
manページから
:
realloc() changes the size of the memory block pointed to by ptr to size bytes.
The contents will be unchanged to the minimum of the old and new
sizes; newly allocated memory will be uninitialized. If ptr is NULL,
then the call is equivalent to malloc(size), for all values of size;
if size is equal to zero, and ptr is not NULL, then the call is
equivalent to free(ptr). Unless ptr is NULL, it must have been
returned by an earlier call to malloc(), calloc() or realloc(). If
the area pointed to was moved, a free(ptr) is done.
サイドノートでは、あなたは本当に一度にバッファ1つの文字を育て、その数には2つのカウンタ、バッファ容量に1つ、および1つを維持するべきではありませんバッファが満杯になったときにのみバッファを増やします。そうしないと、アルゴリズムのパフォーマンスが著しく低下します。
あなたのコード( 'str [len] = '\ 0';')の最後のステートメントでは、 'str'に割り当てられたメモリの境界から書き出しています。 @Paulに正しいインデックスがあるように見えます。 –
@DavidAlber、Paulは履歴に表示されない質問をすばやく編集しました。ここに示されているインデックスはオリジナルからのものです。そのため、私は自分の答えに「1つずつ」コメントを付けました。 –
@DavidAlberありがとう、私はこのオフバイアールエラーを含むOPコードをコピーしました。私はそれを修正しました。 –
元の質問では、1つ1つの問題を修正しました。とても良い。 –