私はgdbで次のことを調べています:
char *a[] = {"one","two","three","four"};
char *b[] = {"one","two","three","four"};
char *c[] = {"two","three","four","five"};
char *d[] = {"one","three","four","six"};
...そして、私は以下を取得します:
(gdb) p a
$17 = {0x80961a4 "one", 0x80961a8 "two", 0x80961ac "three", 0x80961b2 "four"}
(gdb) p b
$18 = {0x80961a4 "one", 0x80961a8 "two", 0x80961ac "three", 0x80961b2 "four"}
(gdb) p c
$19 = {0x80961a8 "two", 0x80961ac "three", 0x80961b2 "four", 0x80961b7 "five"}
(gdb) p d
$20 = {0x80961a4 "one", 0x80961ac "three", 0x80961b2 "four", 0x80961bc "six"}
文字列ポインターが同等の単語で同じであることに本当に驚いています。別の配列の文字列と同じであるかどうかに関係なく、各文字列がスタック上に独自のメモリを割り当てられると思っていたでしょう。
これはある種のコンパイラ最適化の例ですか、それともこの種の文字列宣言の標準的な動作ですか?