コードnames
には、char への 6 つのポインターの配列があります。これで、これらのポインターのそれぞれに、新しい文字列の開始点 (最初の文字のアドレス) を格納できるようになりました。これは、変数に 6 つの異なる文字列の開始アドレスを格納できることを意味しますnames
。
ただし、ループを使用してこれらの各文字列を初期化する場合は、各文字列の長さをマシンに通知する必要があります。これにより、連続したアドレス ブロックを割り当てることができ、その最初のアドレスをポインタに格納して、ストリング。したがって、文字列を格納するのに十分だと思われる特定のサイズを割り当てる必要があります (例: 256 バイト、1 バイトは 1 文字)。これがないと、マシンは文字列のすべてのバイトを格納する場所を認識できず、不正なメモリ アクセスが原因でセグメンテーション エラーがスローされます。
したがって、これを行うには、6 つのポインターのそれぞれに、文字列を格納するためのスペースを割り当てる必要があります。これは、を使用してループで実行されますmalloc()
。@K-ballo のコードに基づく:
char* names[6];
int max_length = 256; // The maximum length you expect
for( int i = 0; i < 6; ++i )
names[i] = malloc( max_length * sizeof(char) ); // allocates max_length number of bytes
scanf( "%s", names[1] );
したがって、基本的に、max_length
それぞれが参照する連続した char アドレスの 6 つの異なるブロックがありますnames[i]
。これを行うと、scanf()
標準入力からバイトが読み取られ、names[1] によって参照されるメモリ内のこれらの割り当てられたバイトに入れられます。
最初はこれをすべて理解するのに苦労したので、精巧な説明が役立つと思っただけです. :)