1

文字列の配列の長さがコンパイル時にわかっている作業中の 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 番目のコード ブロックを変更する方法はありますか?

4

4 に答える 4

1

最初の例では、デバッガーは配列のすべての文字を出力します。2 番目の例では、デバッガーはサイズを持たないため、ゼロで終わる文字列のみを出力します。

于 2012-04-08T16:02:55.203 に答える
1

GDB の出力が異なるように見える理由は、最初のケースでarray_person_name[0]は、コンパイル時にサイズがわかっている配列であるため、GDB はその配列についてわかっているすべて (つまり、101 個の要素すべて) を表示しようとするためです。代わりp (char *)array_person_name[0]に を実行すると、配列の「関連する」部分のみが取得されます。

ライブラリ関数が異なる動作を示す場合は、関数が壊れているか、期待どおりに渡していない (つまり、 a 以外のものを期待しているchar **) かのいずれかです。

于 2012-04-08T16:03:01.957 に答える
1

いずれの場合も、array_person_name[i] は初期化されません。

最初のバージョンはスタックを取り、2 番目のバージョンはヒープを取ります。おそらく、統計的な違いが異なる動作を引き起こす可能性があります。ただし、どちらの場合も初期化する必要があります

于 2012-04-08T16:04:01.627 に答える
0

それ以外の

p array_person_name[0] 

試す

ptype array_person_name[0]

2 つの変数の型を比較します。

それらが同じではないことに気付くでしょう。

ところで、私は言わなければなりません

strncpy(person_name, "John Smith", strlen("John Smith")+1 );

バグです、私はあなたが意味したと思います:

strncpy(person_name, "John Smith", 101);
于 2012-04-08T16:44:46.183 に答える