2012-04-07 8 views
0

文字列配列の操作が混乱しています。 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を返します。私が間違っていることは何か考えていますか?

+3

'sizeof(char *)'を使用しない – Anthales

+1

実際に 'strncpy()'を使い、 'person_name'配列の末尾をゼロで埋める初期化子もゼロ充填しているので)、 'strncpy(person_name、" John Smith "、sizeof(person_name));'を使います。一般に、 'sizeof()'を使うと助けになります。配列名を持っているのかポインタだけを持っているのかは慎重である必要があります。 'sizeof(array)'は配列のサイズを示しますが、 'sizeof(pointer)'は配列のサイズではなく、ポインタのサイズを示します。関数の引数はポインタであり、配列ではありません。関数の引数に 'sizeof()'を使用し、文字列で配列のサイズを渡すことに注意してください。 –

+0

ありがとうジョナサン、私は100以上の文字がコピーされている場合、潜在的なエラーを避けるためにstrncpyに '100'を含めました(私はスペースを埋めようとしていません)。私の意図は、 'John Smith'を自動的に' person_name'にコピーし、コンパイラが自動的にヌル文字を含むようにすることです。あなたのコメントがこれに影響するかどうかはわかりません。 – ggkmath

答えて

3

あなたはarray_person_namearray_param内の各項目はperson_name /「BT」へのポインタになりたいので、あなたはchar **をしたい:

char **array_person_name; 

array_person_name = malloc(arraysize * sizeof(*array_person_name)); 

for (int i=0; i<arraysize; i++) 
    array_person_name[i] = person_name; 
+0

Jerryさん、ありがとうございました。「array_param」をmallocするにはどうすればよいですか?たとえば、 'sizeof(*" bt ")'とすることはできますか? – ggkmath

+0

ほとんどの場合、 'ptr = malloc(sizeof(* ptr)* item_count);' –

1

配列person_nameへのポインタをarray_person_name [kk]で定義された文字に割り当てます。 array_person_nameをchar **型として定義することでした。

1

それは64ビットだからあなたは8つのバイトを想定してはいけません。その部分をCにして、sizeof()演算子を使用してください。

関連する問題