アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下のようなプログラムを書きました。(一部省略)
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;
}

A 回答 (3件)

> char data2[8];


と宣言したら、
data2[0]~data2[7]
までの8個が確保されます。

data2[8]にアクセスした場合の結果はどうなるかわかりません。

他の言語では、範囲外エラーになったり、自動で拡張されたりするのですが、Cではその様な処理を行いません。
添字の範囲の管理はプログラマの責任です。

以上、C言語の基本です。忘れないでくさい。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/05/06 00:31

皆さんがおっしゃるように,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がそれを実行できない場合は,エラーが起こりプログラムが異常終了します.
    • good
    • 1
この回答へのお礼

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

お礼日時:2011/05/06 00:31

char data2[8];と宣言した場合、data2の[]内は0~7までが有効です


なので、data2[8] = '\0';は間違い
    • good
    • 1
この回答へのお礼

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

お礼日時:2011/05/06 00:31

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A