Re: pointer
小野@名古屋大学 です.
<s7f65c3nlog.fsf@xxx.kgc.co.jp>の記事において
candy@xxx.kgc.co.jpさんは書きました。
candy> C89 の配列またはポインタで、
candy> 例えば引数が 1 から 3 の配列を疑似的に表現しようと、
(snip)
candy> のように、配列や malloc した範囲の外を指すアドレス
candy> (この場合 vv - 1)を参照することは、
candy> 意図の通りに動くことが保証されているのでしょうか?
ほとんどの処理系では意図した通りに動作すると思いますが, C99 の規
格によると undefined behavior です. C89 の規格は持ってないけど,
C89 でもそうじゃなかったかなぁ.
C99 では Appendix J Portability issues の J.2 Undefined behavior
の中に
Addition or subtraction of a pointer into, or just beyond, an
array object and an integer type produces a result that does not
point into, or just beyond, the same array object.
とあります.
int vv[3], *v = &vv[-1];
は
int vv[3], *v = vv+(-1);
と等価 (6.5.3.2 Address and indirection operators の paragraph 3)
で, この vv+(-1) が上の条件にあてはまるから undefined behavior に
なります.
# どうでもいいけど &vv[3] は OK.
--
名古屋大学大学院 情報科学研究科 計算機数理科学専攻
小野 孝男
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