新城@筑波大学情報です。こんにちは。

In article <040119205150.M0105707@flame.hirata.nuee.nagoya-u.ac.jp>
        takao@hirata.nuee.nagoya-u.ac.jp (Takao Ono) writes:
> 小野@名古屋大学 です.
>> char src[10]; のような配列の場合、未定義でアクセスしても、そ
>> れだけでは決して bus error になったりはしません。単に前に使っ
>> ていたメモリの内容が出てくるだけです。

> a[10] という配列の場合, アドレスとしては a+0〜a+10 が, データとし
> ては a[0]〜a[9] が有効であり, それ以外のアクセスについては
> undefined behavior となっています. 従って
> 現実的には:
> bus error はないかもしれませんが segmentation fault はありえます.

そうですか。私は、segmentation fault も、あり得ないと思いま
す。どういう仕組みで segmentation fault が起きるのか、説明し
てもらえませんか。

たとえば、
     char a[10];
    a[5] = 10 ;
は、 OK ですよね。初期化だし。これが OK ということは、メモリ
は既に割り当てられていることが保証されているわけです。機械語
命令だと番地の計算はできて、store は OK。これが OK の状態で、
a[5] = 10 ; の代りに
    x = a[5] ;
とすると、これは、番地の計算は OK で、store が load に変った
だけです。segmentation fault は、番地の計算が狂った時に出る
ので、store が ok で load で出るという話は、ありません。

というのが、新城の説明。segmentation fault が起きるという納
得の行く説明ができるなら、聞きたいです。

ROM とかテキストに置く文字列かなにかで load はできるけど 
store できないというのは、あります。逆に store できて load 
できないというのは、普通のメモリではないんじゃないですか。な
にかありますか。ハードウェアのレジスタならあるんでしょうけれど。

> 規格上は:
> undefined behavior なので, 何が起きても文句は言えません.

文句は言えないから起きるというのでは、ちょっと納得できません。

Java だと、array は、0 か何かが入っていることが保証されてい
るんですよね。

\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報       \\