2017-10-22 11 views
0

このプログラムを実行すると、ファーストネームを入力することができ、セグメンテーション違反が発生します。ループ内のファイルに書き込むが、セグメンテーションフォールトを取得する

なぜこのようなことが起こるのか、それを取り除く方法はわかりません。

#include <stdio.h> 

int main (void) 
{ 
     FILE *fp; 

     fp = fopen("list.txt","a+"); 
     if (fp == NULL){ 
       printf("File list.txt could not be opened."); 
     } 

     for(int i=0;i<3;i++){ 
       char *name; 
       char *str; 
       char *sta; 
       printf("Please enter your name: "); 
       scanf("%s",name); 
       printf("Please enter your street: "); 
       scanf("%s",str); 
       printf("Please enter your state: "); 
       scanf("%s",sta); 
       fprintf(fp,"%s,%s,%s\n",name,str,sta); 
     } 
     fclose(fp); 
} 
+1

最初の質問:デバッガは何を言っていますか? – tadman

+2

ヒント: 'char * name'は' scanf'ですぐに使用できる文字バッファではありません。初期化されていません。スペースを割り当てられていません。それは爆発するだろう。 – tadman

+0

scanfの[documentation](http://www.cplusplus.com/reference/cstdio/scanf/)には、「...(追加の引数)」と書かれています フォーマット文字列に応じて、関数は追加のシーケンス引数には、割り当てられた記憶域へのポインタを含む** **抽出された文字の解釈が適切な型で格納されている ' '(emphasis mine) – Les

答えて

0

これをコンパイルしようとすると、コンパイラは、正確に何を言うのでしょうか?あなたの問題はscanfを使用している方法の可能性が高いと思われます。はい、scanfは変数へのアドレス/ポインタを取りますが、この時点であなたが持っているchar *変数は初期化されておらず、おそらくそれらにゴミが含まれている可能性があります。代わりに、char配列(char [])変数を使用してください。あるいは、mallocのような動的メモリアロケータを呼び出すか、他の既存の文字配列のアドレスを格納することによって、charポインタ(char *)を初期化する代わりの方法を使用してください。

ボーナス:はい、char name [10]はchar * p = malloc(10)と同じです。 Char name [10]はそれぞれが10バイトのサイズの配列であり、char "name"変数は暗黙的に前記10文字の最初の要素へのポインタであり、malloc(10)は10バイトのポインタを返しますメモリ内にある。どちらも10バイトのポインタを生成します。

+0

はい、私はchar name [10]とchar * name = malloc(10)で動作するようにしました。私は考えていた。これらは同じですか?または、微妙な根本的な違いがあります –

+0

あなたのコメントに答えるために私の答えを編集しました。 :) – redBhutan

+0

助けてくれてありがとう! –