Re: Initializing arrays
新城@筑波大学情報です。こんにちは。
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 か何かが入っていることが保証されてい
るんですよね。
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
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