そのため、 Michael Burrのこの回答へのコメントから学んだように、C 標準では、配列の最初の要素 (割り当てられたメモリが含まれていると思われます) を過ぎたポインターからの整数減算はサポートされていません。
結合された C99 + TC1 + TC2 (pdf)のセクション 6.5.6 から:
ポインターオペランドと結果の両方が同じ配列オブジェクトの要素を指している場合、または配列オブジェクトの最後の要素の 1 つ後ろを指している場合、評価はオーバーフローを生成しません。それ以外の場合、動作は未定義です。
私はポインター演算が大好きですが、これはこれまで心配したことはありませんでした。私はいつもそれを仮定してきました:
int a[1];
int * b = a - 3;
int * c = b + 3;
それc == a
。
だから、私は以前にそのようなことをしたことがあり、噛まれたことはないと信じていますが、それは私が働いてきたさまざまなコンパイラの親切さによるものに違いありません.私が思っていたようにポインター演算を機能させます。
だから私の質問は、それはどのくらい一般的ですか? 私のためにその親切をしない一般的に使用されるコンパイラはありますか? 配列の境界を超えた適切なポインター演算は事実上の標準ですか?