2017-07-19 18 views
2

私は奇妙な問題に直面しています。後で使用されないintを宣言すると、セグメント化エラーが発生します。宣言を削除すると、コードは完全に実行されます。どうすればいいの?未使用変数を含むセグメンテーションフォールト

FILE* ptr = fopen("prueba.txt", "r"); 
int x; 
char* a; 
int y = 0; //this cause the seg fault. 
do{ 
    while (fscanf(ptr, "%i", &x)!=-1){ 
     fscanf(ptr, "%s", a); 
      printf("%i %s ",x, a); 
    } 
    fseek(ptr, 0, SEEK_SET); 
}while(1); 


fclose(ptr); 
} 

しかし、私はそれを使用している場合でも、printf後、私はまだセグメンテーションフォールトを取得しています、y++;と言います。

+0

fscanf(ptr、 "%s"、a);これは問題のようです。 aはmallocされていません – CIsForCookies

+2

'fscanf(ptr、"%s "、a);'はランダムなメモリを上書きします。変数を追加することによって、どのランダムメモリが暴走するかを変更することになります。 – Art

+0

@Art、あまりにも短い回答はコメントに自動変更されます。回答がAnswersセクションに表示されるようになると、この質問が「未回答」セクションに永久に表示されなくなります。 – CDahn

答えて

5

私はまだセグを取得しています。失敗。

まあ、segfaultは原因Aによって引き起こされ、しばらくしてから捕捉されます。

この行:fscanf(ptr, "%s", a)は、最初にメモリを割り当てずに文字列をaに読み込んでいます - > UB。

UBは、printfでのみ呼び出されます。 a=malloc(SOME_SIZE)またはchar a[SOME_SIZE]aを修正し、これはあなたがcallocmalloc機能を使用することにより、char *aをcharへのポインタを初期化する必要があり

1

離れて行く必要があります。あるいは、自動保存期間がchar a[20];のアレイを使用してください。あなたのコードで

、あなたはfscanf()は、メモリの未定義の領域に上書きしようとしていることを効果的に意味fscanf()に初期化されていないポインタを渡しています。

+1

* use stack-allocated *「自動ストレージ時間でアレイを使用する」という言葉を変更した方が良いでしょう。 –

関連する問題