2016-11-12 11 views
-1

にscanfの方法:私は構造体は次のように定義されている動的に割り当てられた構造体int型

typedef struct { 
    char* name; 
    int* phone; 
} person; 

次のように割り当てられた:

person* Person[numNames]; 
    for (i =0; i<numNames; i++) { 
     Person[i] = malloc(sizeof(person)); 
     Person[i]->name = malloc(25 * sizeof(char)); 
     Person[i]->phone = malloc(sizeof(int)); 
     memset(Person[i]->phone, 0, sizeof(int)); 
    } 

は次のように携帯電話に入力を読む:

for (i=0; i<numNames; i++) { 
    printf("%s: ", Person[i]->name); 
    scanf("%d", &Person[i]->phone); 
    } 

これは私にセグメンテーションフォールトを与えます:(Person [i] - > phoneから私にセグメンテーションフォールトが与えられます)

for (i =0; i<numNames; i++) { 
    printf("%s: %d", Person[i]->name, *Person[i]->phone); 
    } 

セグメンテーションフォルトなしでPerson [i] - phoneに正しくスキャンするにはどうすればよいですか?

+0

なぜ、1つの 'int'にメモリを割り当てるのですか?そして、電話番号に「+」などの非数字が含まれているとしますか? –

+1

スキャンで&を削除します。それはscanf( "%d"、Person [i] - > phone)でなければなりません。 – MayurK

+0

注:電話番号は1桁の数字と特殊記号で構成されています。両方とも単一の文字で、シンボルは整数ではなく、数字は隣接することができます。だから、単純な 'char'配列ではなく' int'配列を使う理由は何ですか? – Olaf

答えて

0

scanf requires you to pass a pointer to the "target" memory locations.は現在、ここでポインタへのポインタを取っている:

scanf("%d", &Person[i]->phone); 

...しかしPerson[i]->phoneはすでにint*で、1 intに適したメモリ位置を指しています。次のコールは、phoneフィールドに正しく入力されます。

scanf("%d", Person[i]->phone); 
関連する問題