同前々3
まろくって。。
文字列(というかchar*)は、'\0'を末尾につけることにより、値の終わりを示せるわけだが、 まろく(mmap/sbrk/brk)はそのへんどうなっているの。。 よくよく調べてみれば不思議なこと(現状理解していないところ)が多い。
mallocによる確保外の領域への参照 - C・C++ 解決済 | 教えて!goo
これ見てよくわからなくなった。 (セグメンテーションフォルトがどういうときに起きるのかをちゃんと分かっていない。 C言語のポインタは私の思っている以上の以上に緩いらしく、(キャスト至上主義だと最近知った) セグフォはもっと、頻繁に起きるものだと思っていた。)
以下のようなアクセスのしかたは「確保していない領域を使用している」ので、セグメンテーションフォルトが起きてしかるべきだと思っていた。
1) (pelem_point+100)->x
あと、
2) ( (point *)(pelem_point+100) )->x
で構造体としてアクセスできるのはまあいいけど、 1)でも可能なのがよくわからなくなった。 (Cのコソパヨヤーの仕組みがよくわかっていない。)
・x[y] は (x + y) の糖衣構文 ... (i) ・x->y は (x).y の糖衣構文 ... (ii) と知ったときにはいろいろ理解が進んだ気がした。まあそうなんだけど... あと、こんな年にもなってひどいんだけど、structの宣言をポインタ変数でしかしたことがなかったので、ドット演算子があることを知らなかった。(おかむるいえーい)
この話をもってくると、 (pelem_point + 100)->x は (ii)より、(*(pelem_point + 100)).x (i)より、(pelem_point[100]).x
ここで漸く納得である。
しかし、なぜこれで違反にならないかはわからないままだ。:-D
static /
mmap/brk/sbrkのmanぺじ読んでいると、知らない単語が出てくるので、調べると、またそのぺじに知らない単語が出てきて... その繰り返しである。
リンカの話が出てきたときは闇だった。なんせ事前知識が皆無に近いので。(そういうdocumentを見る程、他のぺじに飛ばされる数が多くなる。)