2016-10-30 24 views
2

scanfループをコメントアウトすると、セグメント化エラーが消えます。ループが私にセグメンテーションフォールトを与えているのはなぜですか?なぜscanfループからセグメンテーションフォルトが発生しますか?

char** nameArray = malloc(numNames * sizeof(char *)); 

for(i =0; i< 10; i++) { 
    nameArray[i] = malloc(25 * sizeof(char)); 
} 

for (i = 0; i< numNames; i++) { 
    scanf("%s", &nameArray[i]); 
} 

for (i =0; i<numNames; i++) { 
    free(nameArray[i]); 
} 
+0

文字列はどれくらいスキャンされますか?大きな配列をmallocして問題が解決するかどうか確認してください。 – Tmx

+0

'nameArray [i]'にスキャンし、 '&nameArray [i]'にスキャンしないでください。また、 '"%24s "'を書式文字列として使用し、 'scanf'の戻り値をチェックしてください。 –

答えて

2

まず、あなたは十分なエントリを作成する必要があるとして、

for(i =0; i< numNames; i++) { 

for(i =0; i< 10; i++) { 

を変更する必要があります。

はまた、あなたは、必要に応じて文字ポインタであるnameArray[i]として

scanf("%s", nameArray[i]); 

にこのライン

scanf("%s", &nameArray[i]); 

を変更する必要があります。

また、バッファオーバーランを防止するであろう。このよう

scanf("%24s", nameArray[i]); 

を使う方が良いでしょう。また、nameArray[i]はすでにmallocから入手したポインタ、であるので、それがあるので、あなただけの

scanf("%s", nameArray[i]); 

を使用して、scanfにそのポインタを渡す必要が乏しい

2

の戻り値をチェックすることをお勧めだろう&なし。

1

あなたは割り当てをしなければなりません。 あなたのケースであなただけの10 namearray要素

を割り当てるあなたはscanfのだろう、すべての変数の割り当てを行う必要があります。 numNames

for(i =0; i< numNames; i++) { 
    nameArray[i] = malloc(25 * sizeof(char)); 
} 

変化10と&記号がポインタの場合にはノルマルcharlsで使用されていますそれを使わないでください。

scanf("%s",nameArray[i]); 
関連する問題