2011-10-21 1 views
1

ファイルから文字を1行ずつ読み込み、その文字を文字列に配置しようとしています。ここに私のコード:ファイルから行を読み取るとクラッシュする

realloc行でプログラムがクラッシュします。私がその行をループの外に移動したりコメントアウトしたりすると、クラッシュすることはありません。文字を読み込んで標準出力に送るだけであれば、すべて正常に動作します(つまり、ファイルが正しく開かれています)。問題はどこですか?

答えて

6

最初にmallocで生成されなかったポインタはreallocできません。

また、オフに1つのエラーがあり、問題が発生する可能性があります。

+0

元の質問では、1つ1つの問題を修正しました。とても良い。 –

2

realloc文字列リテラルは使用できません。また、すべての新しいcharを入力することは、これを行う効率的な方法ではありません。 gnuの拡張子はgetlineです。

6
をするようにコードを変更し

:あなたがいない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つを維持するべきではありませんバッファが満杯になったときにのみバッファを増やします。そうしないと、アルゴリズムのパフォーマンスが著しく低下します。

+0

あなたのコード( 'str [len] = '\ 0';')の最後のステートメントでは、 'str'に割り当てられたメモリの境界から書き出しています。 @Paulに正しいインデックスがあるように見えます。 –

+2

@DavidAlber、Paulは履歴に表示されない質問をすばやく編集しました。ここに示されているインデックスはオリジナルからのものです。そのため、私は自分の答えに「1つずつ」コメントを付けました。 –

+0

@DavidAlberありがとう、私はこのオフバイアールエラーを含むOPコードをコピーしました。私はそれを修正しました。 –

関連する問題