文字列配列の操作が混乱しています。 forループで2つの配列を埋めるようにしています。各配列内では、すべての要素が同じです。Cプログラム:文字列配列の操作に関する初心者の混乱
メモリを節約するため、array_person_name
のために、ポインタをperson_name
によって格納された文字列に単純にコピーしようとします。 array_param
の場合、ポインタを格納する文字列は常に2文字(たとえば "bt")にヌル終了文字を加えた長さで、ここでもまた "bt"へのポインタをarray_param
に保存することによってメモリを節約しようとします。
配列要素の数がarraysize
であるため、プログラムの実行時にデータベースからダウンロードされるため、mallocを使用してメモリを割り当てます。私のOSは64ビット(Linux x86-64)なので、arraysize
ポインタごとに8バイトを割り当てます。示されていませんが、私はこれらの2つの配列をプログラムの最後に解放します。
int kk, arraysize;
char person_name[101] = "";
char * array_person_name;
char * array_param;
...
strncpy(person_name, "John Smith", 100);
arraysize = <this value is downloaded from database>;
...
array_person_name = malloc(8 * arraysize); /* 8 is for 64b OS */
array_param = malloc(8 * arraysize);
for (kk = 0; kk < arraysize; kk++) {
array_person_name[kk] = &person_name;
array_param[kk] = &"bt";
}
/* test results by printing to screen */
printf("Here is array_person_name[0]: %s\n", array_person_name[0]);
printf("here is array_param[0]: %s\n", array_param[0]);
コンパイラは、forループ内の2行に警告:warning: assignment makes integer from pointer without a cast
を返します。私が間違っていることは何か考えていますか?
'sizeof(char *)'を使用しない – Anthales
実際に 'strncpy()'を使い、 'person_name'配列の末尾をゼロで埋める初期化子もゼロ充填しているので)、 'strncpy(person_name、" John Smith "、sizeof(person_name));'を使います。一般に、 'sizeof()'を使うと助けになります。配列名を持っているのかポインタだけを持っているのかは慎重である必要があります。 'sizeof(array)'は配列のサイズを示しますが、 'sizeof(pointer)'は配列のサイズではなく、ポインタのサイズを示します。関数の引数はポインタであり、配列ではありません。関数の引数に 'sizeof()'を使用し、文字列で配列のサイズを渡すことに注意してください。 –
ありがとうジョナサン、私は100以上の文字がコピーされている場合、潜在的なエラーを避けるためにstrncpyに '100'を含めました(私はスペースを埋めようとしていません)。私の意図は、 'John Smith'を自動的に' person_name'にコピーし、コンパイラが自動的にヌル文字を含むようにすることです。あなたのコメントがこれに影響するかどうかはわかりません。 – ggkmath