プロが教えるわが家の防犯対策術!

C言語の勉強をしている者です。
やっとこさポインタのところまでやってきまして、いろいろ試しているところなのですが、不可解な事が起こったので質問させてください。

int型の配列を作って、初期化しないままその配列[0]に入っている値を覗くと
-858993460
という値が入っていました。

もう一度配列を作り、メモリのアドレスを確認すると、前に作った配列とポインタのアドレスが同じだったので
そこに0を入れました。
当たり前ですが配列[0]の値は0でした。

さらにもう一度配列を作り、[0]のアドレスの中身を覗くと
-858993460
という値に戻っていました

※配列[0]のアドレスは常に一緒です。

なぜこんな訳のわからない数字( -858993460 )に初期化されているんでしょうか
一度0に初期化したのなら次は0のままになっていると予測していたのですが、どうなっているんでしょうか
どなたか理由のわかる方いませんか

A 回答 (4件)

-858993460を16進表記するとCCCCCCCCになります。


参考URLに示したwikipediaの記事によれば、Microsoft Visual C++のディバグルーチンが
初期化されていないスタックメモリーにこの値を設定しているとのことです。

参考URL:http://en.wikipedia.org/wiki/Magic_number_(progr …
    • good
    • 0
この回答へのお礼

よくこんなの知ってますね!
実はVisualStudioです。
なるほどーゲイツが勝手にやっていたんですね
これで解決しました
ありがとうございます

お礼日時:2010/12/22 14:51

変数の初期値は「不定」なので定まっていません。


実行するたびに変わっているかもしれませんので、「たまたま」でしょう。
処理系によっては、不定値へアクセスすると異常終了することもありますしね。

ちなみにこの値は16進数にすると「FFFFFFFFCCCCCCCC」ですね。なにか規則的なものを感じます。

>一度0に初期化したのなら次は0のままになっている
処理系によるでしょう。確保されたメモリを開放した場合、別の値で書き換えられているかもしれません。どちらにせよ、「不定」です。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

お礼日時:2010/12/22 14:51

そのソースを見せてください。


>もう一度配列を作り
どうやって配列を作ったのですか?
動的に作成したら初期化しないと値はでたれラメですし、静的でも初期値を指定しない限り値はでたらめです。

>さらにもう一度配列を作り、
同じところに配列ができることはありませんので。

この回答への補足

下の方の補足にプログラムと結果を書きました。
同じところに配列ができていないのでしょうか??

補足日時:2010/12/22 14:42
    • good
    • 0
この回答へのお礼

回答ありがとうございました

お礼日時:2010/12/22 14:52

静的でなければ「初期化しないときに入っている値」については誰も何も保証していない. これ以上は具体的なプログラムや環境が明示されな

ければ言いようもない.

この回答への補足

プログラム以下になります

#include <stdio.h>

int main (void)
{
int a[3],i;
printf("%p\n%p\n%p\n",&a[0],&a[1],&a[2]); //ここでアドレスの確認

/*
for(i=0;i<3;i++)
{
a[i] = 0; //2回目のみこの処理をします
}
*/
printf("%d\n",a[0]);

return 0;
}

1回目   
0012FF58
0012FF5C
0012FF60
-858993460

2回目
0012FF58
0012FF5C
0012FF60
0

3回目
0012FF58
0012FF5C
0012FF60
-858993460

補足日時:2010/12/22 14:39
    • good
    • 0
この回答へのお礼

回答ありがとうございました

お礼日時:2010/12/22 14:52

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