文字列の配列の長さがコンパイル時にわかっている作業中の C プログラムがあります。それは:
char array_person_name[3][101];
char person_name[101] = "";
...
strncpy(person_name, "John Smith", strlen("John Smith")+1 );
for(i=0;i<3;i++)
{
sprintf(array_person_name[i], person_name );
}
gdb を使用して最初の要素を確認すると、次のように表示されます (例: "John Smith" + null 文字):
(gdb) p array_person_name[0]
$1 = "John Smith", '\000' <repeats 26 times>, "\003\000\t\000p\005\240 ?", '\000' <repeats 11 times>, "@\337\377\377\377\177\000\000\260\337\377\377\377\177\000\000\001\000\000\000\000\000\000\000\300\332\377\377\377\177\000\000\000\235\230Z5\000\000\000\260\337\377\377\377"
配列内の他のすべての要素は似ています。ここで、このプログラムを変更して、実行時に配列サイズがわからない場合に機能するようにする必要があります。結果は、上記の gdb から出力されたものとまったく同じである必要があります (ただし、null の後の文字は異なる場合があります)。これが私のコードです:
char **array_person_name;
char person_name[101] = "";
...
strncpy(person_name, "John Smith", strlen("John Smith")+1 );
array_person_name = malloc(3 * sizeof(char*)); /* allocate memory for row pointers */
for(i=0;i<3;i++)
{
array_person_name[i] = malloc(101 * sizeof(char)); /* allocate memory for columns */
sprintf(array_person_name[i], person_name );
}
次に、gdb を使用して最初の要素を確認すると、次のように表示されます。
(gdb) p array_person_name[0]
$1 = 0x6cff30 "John Smith"
これら2つのプログラムのgdb出力の違いが何であるかは正確にはわかりませんが、違いが何であれarray_person_email
、入力として受け入れる共有ライブラリが最初のコードブロックで正しく実行し、2番目のコードブロックで正しく実行するには十分ですコードブロック。array_person_email
最初のコード ブロックの結果と同じように見えるように、2 番目のコード ブロックを変更する方法はありますか?