プロが教えるわが家の防犯対策術!

int CYCL;
int DCYCL=100;
int ttime=2000;
int t;

main(){

while(CYCL<=DCYCL){

for(t=0;t<=ttime;t++){

..........................
if(CYCL==DCYCL){
.................

}
if(CYCL==DCYCL){
.................

}

.........................

}

CYCL++;

}

}

のようなプログラムを作っています。しかしなぜかttimeに-23878728というような
よくわからない値が代入されているというエラーが起きていることに気づきました。
そこでprintfを用いて以下のようにエラー場所の探索を行いました。

main(){

while(CYCL<=DCYCL){

for(t=0;t<=ttime;t++){

..........................
printf("a ttime=%d\n",ttime);
if(CYCL==DCYCL){
.................
printf("b ttime=%d\n",ttime);

}
if(CYCL==DCYCL){
printf("c ttime=%d\n",ttime);
.................
printf("d ttime=%d\n",ttime);

}

.........................

}

CYCL++;

}

}

するとprintf("c DCYCL=%d\n",DCYCL);とprintf("d DCYCL=%d\n",DCYCL);
の間のどこかにあることがわかりました。
出力結果は
a ttime=2000
b ttime=2000
c ttime=3000
d ttime=-2382272
そこでprintf("a ttime=%d\n",ttime);をけしてプログラムをまわしたところ
b ttime=2000
c ttime=-2382272
d ttime=-2382272
というふうにprintfをはさむことで値が変わってしまうようになってしまいました。

この問題はどうすれば解消できるのでしょうか?
もとのプログラムを張りたいのですが、10000行近くあり、張ることが出来ません。
またttimeに値を代入するようなことは始めの宣言時以外一切やっていません。

どなたかご教授お願いいたします。

A 回答 (3件)

配列確保領域以外の書き換えやポインタのアドレス(オフセット)計算の間違いなどで ttimeの領域を壊しているのかも知れないですね



とりあえず ttimeを初回の代入だけで済むなら

const int ttime = 2000;
などと 定数扱いにしてしまうとかでしょうか ・・・
    • good
    • 0

メモリ破壊のパターンです。


printfを入れたことにより変数等のメモリ配置が変わったために正しく動作するように見えるだけです。
検出されたのがこの変数であり、他にもある可能性があります。メモリ転送関係(ポインタ等)の全面的な見直しが必要と考えます。
このようなケースではコンパイルオプションの変更でも発現することがあります。
    • good
    • 0

既に回答のあるように、メモリーリークが発生しているのだとは思いますが、その原因は省略されたところにあります。


よって、これだけではどこを治せばよいかは言えません。


あとは、プログラム構成がよくないので、間違いを見付けにくい、というのがあるかもしれません。
もし、 ここにあるのがプログラムの全体だとしたら、 1万行近い main関数なんて考えたくありません。

定数として使っている(と思われる) ttime,DCYCLはともかく、ループカウンタのtや,なにかの計算をするCYCLまでグローバル変数にしてしまっているのも、最近の書き方ではありません。
戻り値も引数も省略した main(){...}という書き方は、現在では使いません。

> main(){
> while(CYCL<=DCYCL){
実際にこの間になにも記述が無いのなら、CYCLの初期化がありません。
グローバル変数にしたことで、たまたま0になっていますが、それを期待して明示的に初期化しないのは思わぬバグの元になります。
明示的に初期化するようにしましょう。
    • good
    • 0
この回答へのお礼

お礼が遅くなりました。
無事解決いたしました。

変数を定義していない個所に
代入をしようとしたため、エラーだったようです。

ありがとうございます。

お礼日時:2011/01/23 00:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!