2016-04-15 8 views
0

私は他の日のポインタで遊んで、私は明示的にint *int変数をキャスト次のコードを思い付いたと明示的にここで このポインタ割り当てはどのアドレスに返されますか?

#include <stdio.h> 

int main (void) 
{ 
    int d; 
    int *p1, *p2; 

    printf("%p\n", p1 = &d); 
    printf("%p\n", p2 = (int *) d); 

    return 0; 
} 

変数キャストのアドレスをプリントアウトした出力です:

ffbff71c 
ffbff878 

私の質問は、その2番目のアドレスとそこに含まれているものは何ですか?

+0

私の質問は、これらの状況のすべてで、なぜこれを行う必要があると感じたのですか。 –

+0

私は何が起こるかを見てみたいので、私は実験しました。私は何が起こったのかを見て、何を作るのか分からなかったので、私は質問しました。 – user50420

答えて

5

ガベージ - 初期化されていない変数の値を出力しています。それはちょうどそれがあなたの他の住所のように見える完全な偶然です。意味のある回答を得るためにdを初期化してください。

+2

'd'が初期化されても有意義な答えが得られないと思います... –

+2

@sunqingyao - ' d'の初期化と一致するので、どの値が出力されるのかが分かります。 –

2

2番目の印刷では、アドレスは印刷されませんが、値はアドレスに変換されます。

最初の割り当てでは、変数のアドレスを取得しています。これはRAMアドレスの一部です。 2番目の代入では、変数の値をポインタに変換しています。変数は初期化されていないので、そのRAMアドレスに配置されたガベージ値です。

1

dは初期化されていないため、メモリ内の単なるランダムアドレスです。

0

他の人が指摘しているように、不確定な値をポインタに変換しています。その変換を実行するか、または実際にの値を上書きする以外の値を持つを実行すると、未定義の動作が発生します。

変換前にdの値が設定されていた場合、Cは整数がポインタに変換されることを明示的に許可します。しかし、この場合、ほとんどの他人のために、標準は言う:

結果は実装定義である、正しく整列されない可能性があり、参照タイプの実体を指していない可能性があります、とトラップ表現かもしれません。

[C2011、6.3.2.3/5]

だから、基本的には、行いませんので、あなたが結果がコードのあなたの特定の組み合わせでどうなるかを自分のために確実に決定するのに十分知っている限り、Cの実装、コンパイルとリンクのオプション、およびプラットフォーム。

関連する問題