Re: Initializing arrays
yas@is.tsukuba.ac.jp (Yasushi Shinjo) writes:
> > a[10] という配列の場合, アドレスとしては a+0〜a+10 が, データとし
> > ては a[0]〜a[9] が有効であり, それ以外のアクセスについては
> > undefined behavior となっています. 従って
> > 現実的には:
> > bus error はないかもしれませんが segmentation fault はありえます.
>
> そうですか。私は、segmentation fault も、あり得ないと思いま
> す。どういう仕組みで segmentation fault が起きるのか、説明し
> てもらえませんか。
もしかして用語の行き違いがあるんじゃないでしょうか。
小野さんがおっしゃってる「アドレスとして有効」というのは、「ポインタと
して有効な(たとえば、比較して正しい結果となる)値である」ということでしょ
う。「アドレス空間がマップされている」というOS的な意味ではなくて。
つまり、
・オブジェクトへのポインタ
・関数へのポインタ
・nullポインタ
・配列の最後の要素の「すぐ次」を指すポインタ
のいずれかです。nullポインタや配列の最後+1番めへのポインタは、「ポインタ
として有効」ですが、dereferenceしてはいけませんよね。
規格が想定しているのはたとえば、リニアでない(セグメント方式の)アドレス
空間を持つマシンです。 任意のポインタ同士では、アドレスが全順序でない
ので、比較がうまくいかなかったりします。
でも、配列の先頭から配列の最後の要素の「すぐ次」のアドレスまでは比較が
できないと困るので、その範囲は全順序を保証するように処理系を作りなさい、
ということです。で、もちろん「最後のすぐ次」を読み書きできるようにする
必要はないわけですけど。
http://www.lysator.liu.se/c/rat/c3.html#3-3-6
http://www.lysator.liu.se/c/rat/c2.html#3-2-2-3
前田敦司
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735