1

FILE* からテキストの文字列を読み込もうとしていますが、試行するたびにセグメンテーション エラーが発生します。これが私がプログラムで行っている唯一のことなので、なぜこれが起こっているのかよくわかりません。

#include <stdio.h>

int main(){
  FILE* file;
  char* string;
  file = fopen("practice.txt", "r");
  fgets(string, 100, file);
  printf("%s", string);
  return 0;
}
4

4 に答える 4

6

文字列にメモリを割り当てていません。mallocを使用して文字列にメモリを割り当てるか、配列を使用できますchar string[100];

于 2012-10-02T20:17:06.543 に答える
3

読み取る内容を保存するためのメモリを必ず割り当ててください。

char string[101];
于 2012-10-02T20:20:05.810 に答える
1

これは、 が初期化されていないためstringです。stringでありchar *、最初はガベージ値をアドレスとして保持します。これはfgets関数によって逆参照され、未定義の動作が発生します。

どちらか

char string[BUFFER_LEN];

BUFFER_LENそして適切に定義する

またはする

char *string;
string = malloc (sizeof (char) * buf_siz);

wherebuf_sizはバッファの長さを保持します。free (string)文字列を動的に割り当てるときは、 で割り当てられたメモリ ブロックでの作業が終了したときに覚えておいてくださいmalloc。これは良い方法であり、大規模なプログラムでのメモリ リークを防ぐことができます。

の戻り値を確認して、ファイルが正常に開かれたかどうかを常に確認してくださいfopen。返された場合NULLは、開く操作が失敗しました。FILEそれ以外の場合は、ポインターを返します。

于 2012-10-02T20:26:42.437 に答える
1

char *stringポインターを宣言しますが、意味のある場所を指すように設定しません。ファイルから読み取ったテキストを格納するためのメモリを割り当てていません。

次のように、配列を割り当てる必要があります。

char string[101] = {0}; 
...
fread(string,100,file);
printf("%s\n", string);

または実行時にメモリを割り当てます。

char *string;
...
string = calloc(101, sizeof *string);
if (string)
{
  fread(string,100,file)
  printf("%s\n", string);
  free(string);
}

どちらの場合も、0 ターミネータを考慮して 101 文字に十分なメモリを割り当てます。またfread、入力の最後に 0 ターミネータを書き込まないため、どちらの場合もメモリをすべてビット 0 に初期化します (最初のイニシャライザを使用し、2 番目の呼び出しでcalloc)。

于 2012-10-02T20:27:50.440 に答える