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に値を代入するようなことは始めの宣言時以外一切やっていません。
どなたかご教授お願いいたします。
No.1
- 回答日時:
配列確保領域以外の書き換えやポインタのアドレス(オフセット)計算の間違いなどで ttimeの領域を壊しているのかも知れないですね
とりあえず ttimeを初回の代入だけで済むなら
const int ttime = 2000;
などと 定数扱いにしてしまうとかでしょうか ・・・
No.2
- 回答日時:
メモリ破壊のパターンです。
printfを入れたことにより変数等のメモリ配置が変わったために正しく動作するように見えるだけです。
検出されたのがこの変数であり、他にもある可能性があります。メモリ転送関係(ポインタ等)の全面的な見直しが必要と考えます。
このようなケースではコンパイルオプションの変更でも発現することがあります。
No.3ベストアンサー
- 回答日時:
既に回答のあるように、メモリーリークが発生しているのだとは思いますが、その原因は省略されたところにあります。
よって、これだけではどこを治せばよいかは言えません。
あとは、プログラム構成がよくないので、間違いを見付けにくい、というのがあるかもしれません。
もし、 ここにあるのがプログラムの全体だとしたら、 1万行近い main関数なんて考えたくありません。
定数として使っている(と思われる) ttime,DCYCLはともかく、ループカウンタのtや,なにかの計算をするCYCLまでグローバル変数にしてしまっているのも、最近の書き方ではありません。
戻り値も引数も省略した main(){...}という書き方は、現在では使いません。
> main(){
> while(CYCL<=DCYCL){
実際にこの間になにも記述が無いのなら、CYCLの初期化がありません。
グローバル変数にしたことで、たまたま0になっていますが、それを期待して明示的に初期化しないのは思わぬバグの元になります。
明示的に初期化するようにしましょう。
お礼が遅くなりました。
無事解決いたしました。
変数を定義していない個所に
代入をしようとしたため、エラーだったようです。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
printf で二進表示を行いたい。
-
10個出力で改行したいのですが...
-
コマンドラインに出力した文字...
-
ブラックジャック
-
C言語で、「自然数nを入力し、n...
-
error C2143: 構文エラー : ';'...
-
scanfに文字が入力されたときに...
-
4の倍数を論理演算で表す。。
-
縦の棒グラフ
-
パスカルの三角形についてのCプ...
-
(C言語)めちゃくちゃな値にな...
-
ピラミッド表示プログラム。
-
C言語 ツェラーの公式を使った...
-
CTRL+Dでループを抜けるには
-
勝率をプログラムに
-
Visual Sutdio 2017 でのC言語...
-
%P と %X の違い
-
printf( " %2d", p * q );
-
C言語 プログラミング ごめんな...
-
printf()文の書式
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
既約分数の表示プログラム
-
printf で二進表示を行いたい。
-
8人分のテストの点数を入力し、...
-
printf( " %2d", p * q );
-
strcmp
-
CTRL+Dでループを抜けるには
-
4の倍数を論理演算で表す。。
-
%P と %X の違い
-
【C言語教えてください】sin波...
-
c言語でAからZまでを表示する...
-
cshの文字列操作(0埋め)
-
万年カレンダーのC言語プログラ...
-
コマンドラインに出力した文字...
-
scanfに文字が入力されたときに...
-
コンパイルエラーについて
-
ホームページをC言語で作りたい...
-
改行について 1行に何個かづ...
-
台形の面積を求めるプログラム
-
なぜgccはstdio.hをインクルー...
おすすめ情報