- 締切済み
2つのコードの違いについて
以下は間違ったコードですが、コード1では”不正な処理~”が出ますがコード2では出ません。 同じコードに思えるのですが、どうして違いが出るのですか? <コード1> void func(void) { void *buf1[10]; static int i; for (i = 0; i < 100; i++) { buf1[i]=0 ; } } int main(void) { int buf[1000]; func(); return 0; } <コード2> int main(void) { int buf[1000]; void *buf1[10]; static int i; for (i = 0; i < 100; i++) { buf1[i]=0 ; } return 0; }
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- tsukasa-12r
- ベストアンサー率65% (358/549)
推測のですが、コード2でも、 int buf[1000]; の宣言を取ると不正な処理とかいうエラーになるんじゃないでしょうか。 コード1だと、func() が使用しているスタック領域(スタック領域っておわかりになります?)は void *buf1[10]; の分しかないので、i > 9 でスタック領域以外のメモリにアクセスしてしまってエラーになるのではないでしょうか。 コード2だと、 void *buf1[10]; の後ろ ( i > 9 が指すところ ) に、使用されていない buf[1000] の分のスタック領域があって、スタック領域外にアクセスせずにすんでいるだけではないでしょうか。 ( C/C++ の規約としては、宣言の順序と逆の順序でメモリ上に配置される、ということが約束されているのかどうかは、私は知りません。コンパイラによって異なるのかも・・・) Microsoft のコンパイラだと、オプションの指定で、こういうエラーをチェックするコードを埋め込むようなことができたような気がします。
- yusuke_
- ベストアンサー率53% (8/15)
コード1では for (i = 0; i < 100; i++) { buf1[i]=0 ; } と100回繰り返すに対して、 void *buf1[10]; と10までしか宣言してません。 mainの中では1000まで宣言していますが、 これはローカルなので関数funcには渡されないように思われます。 ですのでエラーが出るのではないでしょうか? まあ、私はプログラミングはまだまだ端くれなんで自信がありませんが(^^;
お礼
回答ありがとうございます。 変数名を明確に変えれば良かったのですが、コード2はの記述はint buf[1000]; であってint buf1[1000];ではないのですが。
お礼
回答ありがとうございます。 回答頂いたことをヒントに考えて漸く分かりました。 コード1は関数の復帰情報等が破壊されるからですね。