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 <buic3k$6ie$1@ns.src.ricoh.co.jp>
        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] を使うとどうなるかという話。
もともとは。

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