• ベストアンサー

変数の値が勝手に変化する原因

以下のようなプログラムを書きました。(一部省略) data2[8] = '\0'; の行が実行された後になぜかgの値が1から0に変化してしまいました。 勝手に変数の値が変化しており、原因が把握できていません。 この原因として考えられることがあれば教えていただけないでしょうか? よろしくお願いします 以下、書いたプログラムです。 char data2[8]; FILE* fp; int g; int main{ fread(data2,8,1,fp); data2[8] = '\0';    ←ここでgの値が変化します。 fread(data2,8,1,fp); data2[8] = '\0'; return 0; }

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

> char data2[8]; と宣言したら、 data2[0]~data2[7] までの8個が確保されます。 data2[8]にアクセスした場合の結果はどうなるかわかりません。 他の言語では、範囲外エラーになったり、自動で拡張されたりするのですが、Cではその様な処理を行いません。 添字の範囲の管理はプログラマの責任です。 以上、C言語の基本です。忘れないでくさい。

saterain20
質問者

お礼

初歩的なミスですか。ありがとうございます。 なくすとうまくいきました。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • adasnt
  • ベストアンサー率44% (69/154)
回答No.3

皆さんがおっしゃるように,data2[8]は間違いで,こうしたければ char data2[9]; <=9バイト確保 fread(data2,8,1,fp); <=8バイト読み込み data2[8]='\0'; <= 9バイト目をNULLに. とすべきでしょう. プログラムメモリ上では,data2が8バイト,その直後にg が割り当てられているようで, data2[8]はgの4バイトの一部にあたるのだと思います.だから,gの値が変わってしまう. 自分のプログラムを破壊しているということですね. この場合,自プログラム内のメモリにアクセスしているのでOSはエラーを返さないのです. もちろん,破壊した部分がデータではなく,プログラム部分であれば,破壊されたプログラムによってCPUがそれを実行できない場合は,エラーが起こりプログラムが異常終了します.

saterain20
質問者

お礼

初歩的なミスですか。ありがとうございます。 なくすとうまくいきました。

すると、全ての回答が全文表示されます。
  • gao3967
  • ベストアンサー率28% (29/100)
回答No.2

char data2[8];と宣言した場合、data2の[]内は0~7までが有効です なので、data2[8] = '\0';は間違い

saterain20
質問者

お礼

初歩的なミスですか。ありがとうございます。 なくすとうまくいきました。

すると、全ての回答が全文表示されます。

関連するQ&A