2017-09-11 4 views
4

ptrは、未初期化変数xを指しています。 ptrを印刷する前に、10ptrに割り当てて印刷しました。ポインタが初期化されていない変数を指している

#include <stdio.h> 

int main() 
{ 
    int *ptr; 
    int x; 

    ptr = &x; 
    *ptr = 10; 

    printf(" x = %d\n", x); 
    printf(" *ptr = %d\n", *ptr); 
} 

両方ptrxプリント正しい値。しかし、私は疑いがある、それは動作を定義されていますか?

+2

を意味し、それについてお読みください。なぜそれが定義されるか、または定義されないと思いますか?あなたの研究努力はどこですか?あなたが理解していないものは何を見つけましたか?それらを追加することは良い質問であり、犯罪ではありません。 –

+0

初期化されていない変数のvalue_にアクセスすると、誤って定義されている可能性のある動作のみが呼び出されます。 – Lundin

+0

あなたはあなたが何を意味するかを説明してもらえ「間接参照 'ptr'前に、私はptr''に10 ' '割り当てられ、それを間接参照しています。」 ?あなたはそれデリファレンスあなたの前にそれを逆参照。* ptr'(ない 'ptr'isがデリファレンス' '10'to割り当て? – Gerhardh

答えて

13

はい、そうです。有効な値をptrに割り当て、間接を使用して有効な値をxに割り当てます。

xのような変数のアドレスとその値は別個のものです。記憶域が割り当てられた後、アドレスの取得は、変数の値に関係なく常に正確に定義されます。

+1

(かのようにポインタがどこにも周りに渡されることはありませんよう、コンパイラはまだ、* *これらを最適化することができるが) –

+1

@ AnttiHaapalaは - 。うん、それは確かにコードの動作はまだしかし、いずれかの方法を定義しますれたままです。 – StoryTeller

1

私の理解では、メモリに書き込む前にメモリを初期化する必要がないため、動作が定義されています。

1

はい、宣言すると、プレースホルダ/メモリが利用できるようになるため、 が表示されます。

ptr = &x; *ptr = 10; コードが効果的に

x =10

関連する問題