3

このSOの質問に対する回答を読んでいるときに、範囲外のポインター演算が定義されていないことを学びました。実際、C996.5.6パラグラフ8によると

ポインタオペランドと結果の両方が同じ配列オブジェクトの要素を指している場合、または配列オブジェクトの最後の要素を1つ過ぎている場合、評価によってオーバーフローが発生することはありません。それ以外の場合、動作は定義されていません。

そのオブジェクトを解放すると、その保証が無効になりますか?7.20.3.2「自由機能」はそれについて言及していないようで、単に「スペースの割り当てが解除されている」と述べています。6.5.6はオーバーフローについて具体的に言及しているため、整数のオーバーフローの問題のように見えますが、freeは影響しません。オブジェクトへのポインタの算術は「それを参照する」行為ですか?

言い換えれば、次のとおりです。

char *foo = malloc(10);
free(foo);
foo++;

未定義?それとも、「オーバーフロー」の使用法は別のものですか?

4

2 に答える 2

5

C99§6.2.4は言う:

ポインタが指すオブジェクトがその存続期間の終わりに達すると、ポインタの値は不確定になります。

§7.20.3は、以下によって作成された、割り当てられたオブジェクトの存続期間について説明していますmalloc()

割り当てられたオブジェクトの存続期間は、割り当てから割り当て解除まで延長されます。

したがって、正式に言えば、ポインタの値は、のfoo後に不確定になりfree()、したがって、どのオブジェクトも指しているとは言えなくなります。したがって、増分の動作は定義されていません。

于 2012-07-31T05:53:49.367 に答える
1

無効化されたポインタに対して算術演算を実行すると、未定義の動作が呼び出されます。

于 2012-07-31T05:44:03.663 に答える