07/11/15 11:24:57
>>328
加減演算子
ポインタオペランド及びその結果の両方が同じ配列オブジェクトの要素、又は
配列オブジェクトの最後の要素を一つ越えたところを指している場合、演算に
よって、オーバーフローを生じてはならない。それ以外の場合、動作は未定義
とする。
あくまで未定義といっているのだから、規格上は何でもあり得る、つまり
実装依存ということになるね。>>329の言っている、エラーが出ない
とか参照しなければ単なる数字になるということは、多くの実装がそう
なっているだけであって、str+5000の加算演算で仮にクラッシュする実装が
あっても、それは規格には従っていることになる。結局、この場合、
動作は未定義だから実装まかせ。
なので、厳密には>>328の意見が正しいと思われる。
335:デフォルトの名無しさん
07/11/15 13:04:40
実際、タイトなメモリ空間モデルを持っている実装では、割と容易に起こり得る。
例えばint array[2]に対してarrayが0xfff0にアサインされているかもしれない。
ポインタもintも16bitなら、array + 4が0になってしまい、NULLと区別できなくなってしまう。
# 流石に即クラッシュはしないだろうけどね。
336:デフォルトの名無しさん
07/11/15 14:02:36
境界の問題はポインタ特有の話じゃありませんね
337:デフォルトの名無しさん
07/11/15 17:44:01
それがどうかしましたか?
338:デフォルトの名無しさん
07/11/15 17:57:27
つまり見当違い
339:デフォルトの名無しさん
07/11/15 18:16:43
どこが?
そもそも誰か、境界の話なんてしているんですか?
340:デフォルトの名無しさん
07/11/15 18:31:33
>>336が場違いな件について
341:wolf ◆8VH3XAqjlU
07/11/15 22:09:24
>>311
*** For your reference ***
Windows. _heapwalk (CRT)
URLリンク(msdn2.microsoft.com)(VS.80).aspx
Linux 2.4x
src\drivers\char\drm\sis_ds.c "void mmDumpMemInfo( memHeap_t *mmInit )"