質問をする前に、「エキスパート C プログラミング」[ページ:276、最後の段落] を引用したいと思います。
「Illiffe ベクトル データ構造体の優れた点は、文字列へのポインターの任意の配列を関数に渡すことができることですが、ポインターの配列のみ、および文字列へのポインターのみを渡すことができます。これは、文字列とポインターの両方に明示的な out の規則があるためです。 -エンド マーカーとして使用できる境界値 (それぞれ NUL およびNULL )。"
したがって、上記のテキストから私が理解したのは、ポインターの配列がある場合、それらは NULL のような明示的な範囲外の値を持つということです。(私が間違っている場合は訂正してください...)
そのため、ポインターの配列のデフォルト値は何なのか疑問に思いました(ポインターの配列の最後のポインターはNULLになると考えていました)。以下のコード スニペットを試してみましたが、結果は大きく異なりました。
int *x[2];
printf("%p %p",x[0],x[1]);
出力は次のとおりです: (nil) 0x400410
int *x[3];
printf("%p %p %p",x[0],x[1],x[2]);
出力: 0xf0b2ff 0x400680 (なし)
int *x[4];
printf("%p %p %p %p", x[0],x[1],x[2],x[3]);
出力は次のとおりです: (nil) 0x4003db 0x7fffe48e4776 0x4006c5
したがって、上記の出力では、明示的な境界外 (nil) 値がポインターの 1 つ (1 つのポインターは NIL) に割り当てられていることは明らかですが、それは本当にエンドマーカーですか? いいえ。
C言語の「実装定義」の1つですか?
Ubuntu マシンで GCC コンパイラ (4.6.3) を使用しています。