[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[WitchTech 00371] Re: 配列?ポインタ?



dieです。

On Tue, 22 Aug 2000 13:25:49 +0900
in [WitchTech 00370] Re: 配列?ポインタ?
Shigeki Yamamoto <shige@tsi.co.jp> wrote:

> あんみつ です。

> > > 	int a[] = { 40, 50, 60, 70, 80, }, *pa = a;
> > > 	int b[] = { 30, 25, 22, 38, 41, }, *pb = b;
> > この部分を「実行(初期化)」するときに、プログラマの意図しない
> > メモリを破壊しています。「プログラマの意図したメモリ」はスタック上に
> > なるのですが、実際にはデータセグメントの特定位置を初期化しています。
> なぜそうなるかを知りたいのですが。。。
> 一般的なコンパイラが吐く常識的なコードとしては、配列用の領域としてスタッ
> クフレーム上に sizeof(int)*5 バイト確保され、その後各要素への初期値の
> 代入が行われるような形になると思うのですが、これは、(おそらくデータセ
> グメント上にある)初期値の列を、(スタックセグメント上にある)配列の領域
> にコピーする際に、コピー先のセグメントにスタックセグメントを指定してコ
> ピーするようなコードを吐いてくれない、ということでしょうか??

まさにおっしゃる通りの理由です。
コンパイラはDS(データセグメント)==SS(スタックセグメント)だと
思い込んでいるので、「コピー先はSSだけどDS使っても大丈夫」と
ばかりにコピー作業を行います。Witchではそうならないので問題発生。

> どういう場合にセグメントの問題が発生するのか、いまいち慣れていないので

もう十分理解されていると思います(^^)。

> すぐ暴走させてしまいます。まるでおまじないのようにstaticと書いてみたら
> 動くようになった、というのがかなり多くて、しかも一時的にしか使わないの
> に専用の領域を静的に確保してしまっているのがなんとなく気持ち悪くて。。。

どうしてもスタックを使いたいのであれば memcpy() とかで初期化する
しかないと思います。コンパイラには頼れません。

メモリ確保、解放の頻度が少ないのであれば拙作のwwheapでもメモリ確保が
出来ますが、こっちはmalloc()なので初期化はやっぱりmemcpy()・・(^^;

___
澤田 大輔(die)
email: die@zonze.nu(home), swd@techbrains.co.jp(office)


ML Archives