Michael Burrのthis answerへのコメントから学んだように、C標準では、配列の最初の要素を超えるポインタからの整数減算はサポートされていません。 the combined C99 + TC1 + TC2のセクション6.5.6(PDF)からどのCコンパイラにポインタ減算アンダーフローがありますか?
:
ポインタオペランドと結果ポイント同じ配列オブジェクトの要素に、または配列オブジェクトの最後の要素過去1両方の場合、評価は、オーバーフローを生じてはならない。それ以外の場合、その動作は不確定です。
私はポインタ算術が大好きですが、これまで私が心配していたことはありませんでした。私は常に与えられたと仮定しています:
int a[1];
int * b = a - 3;
int * c = b + 3;
これはc == a
です。
私はこれまでにこのようなことをしていて、噛まなかったと信じていますが、これまでのさまざまなコンパイラの優しさから、標準では、私が思ったようにポインタの算術演算を行う必要があります。
私の質問は、どれくらい共通点ですか?私のために親切なことをしないコンパイラがよく使われていますか?ポインタの算術演算は、配列の境界を越えて正しく定義されていますか?
CPUアーキテクチャのようにコンパイラの問題ではありません。そこにはいくつかのあいまいなメモリモデルがあります。一般的に、すべてのシステムでプレーンな線形メモリを想定することはできません。ポインターをメモリアドレスと見なさないでください。彼らはそうではありません。彼らには別々の制限があります。 – jalf