Path: ccsf.homeunix.org!ccsf.homeunix.org!news1.wakwak.com!nf2.xephion.ne.jp!nf1.xephion.ne.jp!onion.ish.org!news.daionet.gr.jp!news.yamada.gr.jp!newsfeed.media.kyoto-u.ac.jp!oix.u-ryukyu.ac.jp!u-ryukyu.ac.jp!ie.u-ryukyu.ac.jp!gama.is.tsukuba.ac.jp!yas From: yas@is.tsukuba.ac.jp (Yasushi Shinjo) Newsgroups: fj.comp.lang.c Subject: Re: Initializing arrays Date: 20 Jan 2004 06:29:46 GMT Organization: Institute of Information Sciences and Electronics, University of Tsukuba Lines: 61 Message-ID: References: <040119205150.M0105707@flame.hirata.nuee.nagoya-u.ac.jp> <040120134015.M0108314@flame.hirata.nuee.nagoya-u.ac.jp> NNTP-Posting-Host: kirk.hlla.is.tsukuba.ac.jp X-Trace: gama.is.tsukuba.ac.jp 1074580126 21668 130.158.85.129 (20 Jan 2004 06:28:46 GMT) X-Complaints-To: usenet@gama.is.tsukuba.ac.jp NNTP-Posting-Date: 20 Jan 2004 06:28:46 GMT In-reply-to: takao@hirata.nuee.nagoya-u.ac.jp's message of Tue, 20 Jan 2004 13:40:15 +0900 Xref: ccsf.homeunix.org fj.comp.lang.c:206 In article <040120134015.M0108314@flame.hirata.nuee.nagoya-u.ac.jp> takao@hirata.nuee.nagoya-u.ac.jp (Takao Ono) writes: > 小野@名古屋大学 です. > というのと「ポインタでは〜」というのを対比させたときに「(配列かポ > インタかには無関係に) 変なところをアクセスすれば segmentation > fault になりうる」ということを強調したかっただけですので. 今は、Subject: にあるように、配列を初期化しないで使った時に どうなかという話です。初期化しないで使っても、segmentation fault はないと。 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 はありえます. bus error と segmentation fault は、なにか違いがあるんですか。 アドレスとして a[10] が有効というのは、なんか変です。規格に あるんですか。 外部変数かなにかで int a[4096-100]; int a[4096-104]; という具合いに宣言したら調べられるんでしょうけど。 In article ohta@src.ricoh.co.jp (Junn Ohta) writes: > Mitoさんの示された > | char src[10] = "abc"; > | char dst[100]; > | size_t n = sizeof(dst); > | memcpy(dst, src, n); > ではsrc[0]〜src[99]がアクセスされるわけです。 これは、0 が入っている src[4] で止まるんじゃないですか。 と思ったら、strncpy() じゃなくて、memcpy() か。 それは、memcpy() の使い方が間違っています。 > char src[10]がプロセスに割り当てられたセグメントの > 末尾付近に配置されていた場合、セグメント境界を越え > たアドレスにアクセスすることになるわけで、例外が発 > 生する可能性はあるのではないですか? はい。memcpy() で segmentation fault になることがあると思います。 Subject: は、初期化しない配列を使うとどうなるかという話でし た。src[10] = "abc" で、src[5] を使うとどうなるかという話。 もともとは。 \\ 新城 靖 (しんじょう やすし) \\ \\ 筑波大学 電子・情報       \\