Re: Initializing arrays
小野@名古屋大学 です.
<YAS.04Jan20124855@kirk.is.tsukuba.ac.jp>の記事において
yas@is.tsukuba.ac.jpさんは書きました。
yas> >> char src[10]; のような配列の場合、未定義でアクセスしても、そ
yas> >> れだけでは決して bus error になったりはしません。単に前に使っ
yas> >> ていたメモリの内容が出てくるだけです。
yas> > a[10] という配列の場合, アドレスとしては a+0〜a+10 が, データとし
yas> > ては a[0]〜a[9] が有効であり, それ以外のアクセスについては
yas> > undefined behavior となっています. 従って
yas> > 現実的には:
yas> > bus error はないかもしれませんが segmentation fault はありえます.
yas> そうですか。私は、segmentation fault も、あり得ないと思いま
yas> す。どういう仕組みで segmentation fault が起きるのか、説明し
yas> てもらえませんか。
(中略)
yas> とすると、これは、番地の計算は OK で、store が load に変った
yas> だけです。segmentation fault は、番地の計算が狂った時に出る
yas> ので、store が ok で load で出るという話は、ありません。
もちろん現実的な状況で「store は ok だけど load で segmentation
fault」はないですね... というより, そんなメモリ保護はありえないで
すね. load じゃなく exec ならありえますが.
ただ,
yas> >> char src[10]; のような配列の場合、未定義でアクセスしても、そ
yas> >> れだけでは決して bus error になったりはしません。単に前に使っ
yas> >> ていたメモリの内容が出てくるだけです。
というのと「ポインタでは〜」というのを対比させたときに「(配列かポ
インタかには無関係に) 変なところをアクセスすれば segmentation
fault になりうる」ということを強調したかっただけですので.
yas> > 規格上は:
yas> > undefined behavior なので, 何が起きても文句は言えません.
yas> 文句は言えないから起きるというのでは、ちょっと納得できません。
そこまでは言っていないんですけど....
# そもそもそんなプログラムを作る時点でアウトですけど.
yas> Java だと、array は、0 か何かが入っていることが保証されてい
yas> るんですよね。
Java だと, いかなる場合においても何らかの値 (数値型だと 0,
boolean だと false, オブジェクト型だと null) で初期化されることが
保証されています. これは array の中身についても成り立ちます.
# このように「とにかく何らかの値で初期化される」ことを保証した最
# 初の言語ってなんなんでしょうね? Lisp?
--
名古屋大学大学院 情報科学研究科 計算機数理科学専攻
小野 孝男
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