2016-04-15 17 views
1

私はオンラインで見つけたランダムなプロジェクトを完成させて自分自身を教えようとしていますが、ちょっとした問題に遭遇しました。現在学習中のポインタ。 char型のポインタ配列のインデックスにユーザーが入力した値を正しく格納するにはどうすればよいですか?ポインタインデックスに値を格納しますか?

int i, numberPeople = 5; 

char **firstName = (char**) malloc(numberPeople*sizeof(char)); 
char **lastName = (char**) malloc(numberPeople*sizeof(char)); 
double *scores = (double*) malloc(numberPeople*sizeof(double)); 


// allocating space for each individual person 
for (i = 0; i < numberPeople; i++) { 
    firstName[i] = (char*) malloc(MAXIMUM_DATA_LENGTH*sizeof(char)); // MAXIMUM_DATA_LENGTH = 50 
    lastName[i] = (char*) malloc(MAXIMUM_DATA_LENGTH*sizeof(char)); 
    scores[i] = *(double*) malloc(1*sizeof(double)); 
} 

// begin user input for each person 
for (i = 0; i < numberPeople; i++) { 
    printf("Person #%d \n\n", i + 1); 

    printf("First Name: "); 
    scanf("%s", firstName[i]); 

    printf("Last Name: "); 
    scanf("%s", lastName[i]); // crashes on person[2] ==> EXC_BAD_ACCESS (EXC_I386_GPFLT) 

    printf("Score: "); 
    scanf("%lf", &scores[i]); 
    printf("\n\n"); 
} 

person [2]のlastNameを入力すると、私のプログラムは常に停止/クラッシュします。このエラーは - >"EXC_BAD_ACCESS(EXC_I386_GPFLT)"です。ここで

+0

は、あなたのデバッガを使用することを学びます。サイドノート:この種のプロジェクトには 'structs'を使う必要があります。 –

答えて

2

、あなたはchar配列上のポインタの配列を格納しなければならないので

char **firstName = (char**) malloc(numberPeople*sizeof(char *)); 
char **lastName = (char**) malloc(numberPeople*sizeof(char *)); 

を使用する必要が

char **firstName = (char**) malloc(numberPeople*sizeof(char)); 
char **lastName = (char**) malloc(numberPeople*sizeof(char)); 

。したがって、割り当てサイズが小さすぎます:sizeof(char)が1の場合、1バイトにアドレスを格納することはできません。これについて

+0

私は分かりませんでした、ありがとう! – David

+0

'char'は編集されたバイトではありません。 –

+0

しかし、私は1バイトがOPのコンピュータ上で1オクテットであると確信しています; – Boiethios

0

何:

int i, numberPeople = 5; 

char *firstName = malloc(numberPeople*sizeof(char)); 
char *lastName = malloc(numberPeople*sizeof(char)); 
double *scores = malloc(numberPeople*sizeof(double)); 

// begin user input for each person 
for (i = 0; i < numberPeople; i++) { 
    printf("Person #%d \n\n", i + 1); 

    printf("First Name: "); 
    scanf("%s",&firstName[i]); 

    printf("Last Name: "); 
    scanf("%s",&lastName[i]); 

    printf("Score: "); 
    scanf("%lf",&scores[i]); 
    printf("\n\n"); 
} 
+0

あなたは最初と最後の文字に対してそれぞれ1つの 'char'文字列を割り当てました。あなたの例では、割り当てられたメモリはそれぞれ5バイトです。したがって、4バイトより長い名前は範囲外になります。 valgrindで実行してみてください。次に、 'for'ループは変数内の開始アドレスをインデックスします。名前の配列はありません。 firstNameを印刷するときに 'Amy、Bert、Camille'という3つのファーストネームを入力した場合は、「ABCamille」を取得します。毎回同じ変数に書き込んでいます。 – anita2R

関連する問題