
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.3ベストアンサー
- 回答日時:
既に回答のあるように、メモリーリークが発生しているのだとは思いますが、その原因は省略されたところにあります。
よって、これだけではどこを治せばよいかは言えません。
あとは、プログラム構成がよくないので、間違いを見付けにくい、というのがあるかもしれません。
もし、 ここにあるのがプログラムの全体だとしたら、 1万行近い main関数なんて考えたくありません。
定数として使っている(と思われる) ttime,DCYCLはともかく、ループカウンタのtや,なにかの計算をするCYCLまでグローバル変数にしてしまっているのも、最近の書き方ではありません。
戻り値も引数も省略した main(){...}という書き方は、現在では使いません。
> main(){
> while(CYCL<=DCYCL){
実際にこの間になにも記述が無いのなら、CYCLの初期化がありません。
グローバル変数にしたことで、たまたま0になっていますが、それを期待して明示的に初期化しないのは思わぬバグの元になります。
明示的に初期化するようにしましょう。
お礼が遅くなりました。
無事解決いたしました。
変数を定義していない個所に
代入をしようとしたため、エラーだったようです。
ありがとうございます。
No.2
- 回答日時:
メモリ破壊のパターンです。
printfを入れたことにより変数等のメモリ配置が変わったために正しく動作するように見えるだけです。
検出されたのがこの変数であり、他にもある可能性があります。メモリ転送関係(ポインタ等)の全面的な見直しが必要と考えます。
このようなケースではコンパイルオプションの変更でも発現することがあります。
No.1
- 回答日時:
配列確保領域以外の書き換えやポインタのアドレス(オフセット)計算の間違いなどで ttimeの領域を壊しているのかも知れないですね
とりあえず ttimeを初回の代入だけで済むなら
const int ttime = 2000;
などと 定数扱いにしてしまうとかでしょうか ・・・
お探しの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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10個出力で改行したいのですが...
-
(C言語)めちゃくちゃな値にな...
-
コマンドプロンプトがすぐ消える
-
getchar()マクロによる空白文字...
-
C言語のプログラムでうまく動...
-
九九を表示させるプログラム
-
C言語プログラミング
-
コマンドラインに出力した文字...
-
スレッドとメッセージキューに...
-
c言語でAからZまでを表示する...
-
基本的に問題
-
C言語で、引数が構造体の場合
-
一番大きい奇数を表示する
-
既約分数の表示プログラム
-
4の倍数を論理演算で表す。。
-
switch分のケースを範囲数?に...
-
万年カレンダーのC言語プログラ...
-
hit&bolwのプログラミングがで...
-
2次方程式の解の表示
-
for文内でscanf関数により配列...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
c言語で2000年以降カレンダーを...
-
c言語でAからZまでを表示する...
-
【C】fizzbuzzのトリッキーなコ...
-
strcmp
-
printf で二進表示を行いたい。
-
【C言語教えてください】sin波...
-
コマンドラインに出力した文字...
-
8人分のテストの点数を入力し、...
-
コンパイルエラーについて
-
CTRL+Dでループを抜けるには
-
(C言語)めちゃくちゃな値にな...
-
cshの文字列操作(0埋め)
-
テキストカーソル位置の取得
-
コマンドプロンプトがすぐ消える
-
printfの出力内の文字をdefine...
-
scanfに文字が入力されたときに...
-
台形の面積を求めるプログラム
-
改行について 1行に何個かづ...
-
WM_CLOSEで閉じれないウィンド...
おすすめ情報