• ベストアンサー

値が変わるのはどうしてでしょうか?

c言語でプログラミングを行い、コンパイルが通って実行した時に エラーが出たので、1行ずつコンパイルしてみました。 /////////////////ソース部分////////////////////////////// a_save[0] = A[0] //(a_save と A は同じ構造体タグ) a_save[1] = A[1] a_save[2] = A[2] ///////////////////////////////////////////////////////// →ここでコンパイルしたときは当然のように a_save[0].a という変数の値は A[0].a の値と同じ8となっています。 ここからもう少し進んで /////////////////ソース部分////////////////////////////// a_save[0] = A[0] //(a_save と A は同じ構造体タグ) a_save[1] = A[1] a_save[2] = A[2] b[0] = B[0] //(b と B は同じ構造体タグ(Aとは別)) b[1] = B[1] b[2] = B[2] ///////////////////////////////////////////////////////// →ここでコンパイルしたときに A[0].a の値は8のままだったの ですが a_save[0].a の値が急に-858993460というような値に なっていました。 これは何故なのでしょうか?メモリか何かが原因なのでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • arain
  • ベストアンサー率27% (292/1049)
回答No.9

すでに完結していますが、 >要素数は全て3以上でグローバル変数となっており宣言ミスなどでは無い ----------- >struct KOMA koma2_save[2]; >struct KOM kom2_save[2]; 要素2個ですね。明らかに宣言ミスです。これでは >koma2_save[2] = koma2[max_koma3]; を実行した時点で内部的(メモリ的)には破たんしています。 さらに追い打ちをかけることになりますが >kom2_save[0] = kom2[max_koma1]; >kom2_save[1] = kom2[max_koma2]; >kom2_save[2] = kom2[max_koma3]; ここで使用している「max_koma1~max_koma3」の値は提示されたソースでは「0~29」であると保障できていますか?

stickright
質問者

補足

単純なミスをしていました。失礼しました(汗 max_komaの方も0~29になっているか確認しておきます。 ありがとうございました。

その他の回答 (8)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.8

>要素数は全て3以上でグローバル変数となっており宣言ミスなどでは無い struct KOMA koma2_save[2]; struct KOM kom2_save[2]; 2個しかないようです

stickright
質問者

補足

そうですね^^; 簡単な部分を見落としていました(汗 ありがとうございます。

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.7

struct KOMA koma2_save[2]; struct KOM kom2_save[2]; 要素数が2個しかないのに、3個代入してるけど。 #添え字「0」「1」「2」で代入してる >要素数は全て3以上でグローバル変数となっており宣言ミスなどでは無いので ということで、宣言ミスじゃない?

stickright
質問者

補足

そうですね^^; 簡単な部分を見落としていました(汗 ありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

「今使っているプログラムをそのまま載せてくれ」といってるわけじゃないんだけどなぁ. その中から「削れるところ (= 削っても問題が発生するところ)」を削った上で載せてほしいんだが.

stickright
質問者

補足

前の方に実際の宣言部分などを載せました。 よろしくおねがいします。

  • arain
  • ベストアンサー率27% (292/1049)
回答No.5

No.1です。 やはり、端折られている部分(確認方法など)に問題がありそうですね。 >-858993460 は、単純に16進数に変換した場合「0xCCCCCCCC」となります。 これがどういう意味を持つかというと、Windowsアプリなら「メモリ確保されていない部分を参照している」ということです。 それぞれ構造体ということですが、その構造体自体がポインタであったり、メンバ変数がポインタであったりしませんか? また、表示方法は本当に正しいか確認してみてください。

stickright
質問者

補足

前の方に実際の宣言部分などを載せました。 よろしくおねがいします。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.4

>全体を載せるとどうしても入りきらない では、せめて当該構造体の定義部分と 当該構造体を用いた当該変数の定義部分だけでも 見せてください。

stickright
質問者

補足

実際に使っている構造体は次のようになっています。時間割の振り分け を行うようなプログラムです。 ☆の部分ではkoma2_save[0].subject_class_numberの値が8だったのに ★の部分ではkoma2_save[0].subject_class_numberの値が変わって いました。 // 構造体の定義部分 struct KOMA { int subject_number; int subject_bangou[20]; int subject_stock[20]; int subject_class_number; int class_bangou[20]; int class_code[20]; int class_stock[20]; int student_number; int student[170]; int new_subject_class_number; int new_class_bangou[20]; int new_class_bunkatu[20]; }; struct KOM { int student_number[15]; int student[15][40]; int subject_class_number; int subject_bangou[20]; int subject_class[20]; int subject_class_stock[20]; }; // 変数の定義部分 struct KOMA koma2[30]; struct KOMA koma2_save[2]; struct KOM kom2[30]; struct KOM kom2_save[2]; // 問題部分 // koma2_save にコピーする koma2_save[0] = koma2[max_koma1]; koma2_save[1] = koma2[max_koma2]; koma2_save[2] = koma2[max_koma3]; ☆ // kom2_save にコピーする kom2_save[0] = kom2[max_koma1]; kom2_save[1] = kom2[max_koma2]; kom2_save[2] = kom2[max_koma3]; ★ よろしくお願いします。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

コードを載せるときは はしょらずに全部載せてください。 載せていないところに 問題が隠れていることが ままあります。

stickright
質問者

補足

分かりにくくてすいません。 全体を載せるとどうしても入りきらないので問題の部分をシンプルな形に して載せています。全て一つのファイルの中でグローバル変数を用いている ので宣言ミスなどでは無いと思います。また、他の場所で似たような操作 をしても問題なく実行できています。 上の部分では変わっていなかった変数が下までの数行で直接操作して いなかったにもかかわらず急に変わっていることに疑問を感じています。 コンパイル方法はvc++のカーソル行までコンパイルを用いており、 そのときの変数の値を表示してみました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

これだけで原因が分かると思う方が間違っている. 使っている処理系とか問題が起きる完全な (かつ, できれば最小の) プログラムの例をあげてください. ついでに言うと, 「構造体タグ」に添え字をつけてこんなことをしようとしてもコンパイラが通してくれないはずです.

stickright
質問者

補足

分かりにくくてすいません。 処理系はvc++を使用しています。同じ構造体タグで宣言した変数という 意味です。宣言などにはミスはないと思うので、下のソースは上のソース の続きなので直接操作にかかわっていない変数の値が変化していることに 疑問を感じています。

  • arain
  • ベストアンサー率27% (292/1049)
回答No.1

とりあえずの確認。 ・質問のソース部分は、同じ関数内で連続して記述されていますか? ・a_save[]、A[]、b[]、B[] の要素数はすべて3以上ですか? ・a_save[]、A[]、b[]、B[] をそれぞれ宣言している場所は? ・値がおかしくなるのを確認している方法、また確認したタイミングは? 考えられることとしては、 要素宣言ミスによるメモリ破壊や、ローカル変数を別の関数上から確認しようとしての問題の気がしますが。

stickright
質問者

補足

分かりにくくてすいません。 上のソースから連続して下のソースになっています。 それぞれこの次の行までコンパイルしたときの変数の値となっています。 要素数は全て3以上でグローバル変数となっており宣言ミスなどでは無い ので、直接操作していなかった変数が変わっているのが不思議に思いました。

関連するQ&A

専門家に質問してみよう