0

不規則な配列にいくつかのユーザー入力名を保存しようとしています。ただし、実行時にエラーが発生し、何が問題なのかを理解しようとしています。

私のコード:

int num, count, i;
char *myNames[10];

printf("Enter the number of names: ");
scanf( "%d" , &num);

fflush(stdin);

    // Ask user to input the name
for( count = 0 ; count <= num ; count++)
{
    printf("Enter a name: ");
    scanf( "%s" , myNames[count]);
    fflush(stdin);
}

    // To check if names are stored correctly
printf("%s", *myNames[1]);

return 0;
}

誰かが助けを共有できるか、少なくとも私を正しい方向に向けることができれば感謝します. ありがとう

4

2 に答える 2

1

文字列自体にスペースを割り当てる必要があります。現在、10個のポインターの配列のみを割り当てていますが、実際には有効なメモリを指していません。したがって、 scanf() がそれらに書き込もうとするとエラーが発生します。

もちろん、文字列に適切な量のスペースを割り当てるには、文字列に含まれる文字数を知る必要があります。これは鶏が先か卵が先かという問題です。おそらく、次のように、1 つのスタック割り当て配列を使用して scanf() に書き込み、次に strdup() に書き込む必要があります。

for( count = 0 ; count <= num ; count++)
{
   printf("Enter a name: ");
   char temp[1024];
   scanf( "%s" , temp);
   myNames[i] = strdup(temp);
   fflush(stdin);
}

...もちろん、プログラムを 100% 正しくしてメモリ リークを回避したい場合は、返す前に 10 個の文字列のそれぞれを free() する必要がありますが、これが単なるおもちゃのプログラムである場合は無視してかまいません。 OSにクリーンアップを任せるだけです。

于 2013-02-13T05:30:08.227 に答える
0

char *myNames[10];ランダムなメモリ位置を指す 10 文字のポインタを作成します。scanf( "%s" , myNames[count]);このメモリ ロケーションに書き込もうとすると、アクセス違反が発生します。文字列にメモリを割り当ててから、これらのポインターが次のような方法で割り当てられたメモリを指すようにする必要があります。これによりmyNames[0] = malloc(10);、10 文字分のスペースが割り当てられます。処理が完了したら、 を実行してメモリの割り当てを解除する必要があることに注意してくださいfree(myNames[0]);

于 2013-02-13T05:29:08.720 に答える