2016-03-24 8 views
0
#include <stdio.h> 
int main(){ 
int i=1; 
int * p = &i; 
*(p++)=4; 

printf("%p\n", p); //0x7ffc000f47c8 
printf("%u\n", p); //956816552 (which is 0x7ffc000f47c8 as unsigned integer) 
printf("%u\n", *p); //956816552 (I would expect *p to be the value of whatever is in 0x7ffc000f47c8, and not the unsigned value of the pointer p (956816552)) 

return 0; 
} 

に対して* pの値を変更するIは*pprintf()を0x7ffc000f47c8にあるものの値ではなく、ポインタの符号なしの値であることが期待されますp(956816552))が増分ポインタをDeferencingた(* p ++ = X)P

私は*pの値を956816552(pの値)に設定しましたか?

私は*p++ = 4がUBではないと信じています。 (1番目の回答のコメントによると - Undefined behavior and sequence points

何か助けに感謝します。ありがとう。

+3

*私は* p ++ = 4がUBではないと信じているかもしれませんが、おそらくそうではないかもしれませんが、実際にはあなたが所有していないメモリを指しています。 – stijn

+0

C++の行動規範: – CinCout

+0

おそらく 'p'はメモリ内の' i'に従うので、 'p ++'はそれ自身を指し示す' p'を残します。あなたは確かに "0x7ffc000f47c8にあるもの"を見ています –

答えて

3

p++のインクリメントを実行した後は、オブジェクトを指していないため、pを参照解除できなくなりました。プログラムはpを参照解除するための未定義の動作を呼び出します。この時点では、通常「プログラムが間違っている」と言い、プログラムを修正して移動します。

正確な値が表示されているのが不思議であれば、値は&i+1が何かを起こしたという事故でも、それ以外のものでもかまいません。

注:この場合、インクリメント自体は明確に定義されています。しかし、ポインタをもう一度インクリメントした場合は、iの最後を過ぎて移動したため、問題が発生します。

1

変更プログラム、次のよう

#include <stdio.h> 
int main(){ 
int i=1; 
int * p = &i; 
*(p++)=4; 

printf("%p\n", p); //0x7ffc000f47c8 
printf("%u\n", p); //956816552 (which is 0x7ffc000f47c8 as unsigned integer) 
printf("%d\n", i); //956816552 (I would expect *p to be the value of whatever 
     ^^^^^^^^^ 
is in 0x7ffc000f47c8, and not the unsigned value of the pointer p (956816552)) 

return 0; 
} 

とあなたがiがshangedたことがわかります。声明の後

*(p++)=4; 

ポインタpは、現在の変数xを超えて変化し、ポイントましただからではないポインタデリファレンスがあります。

関連する問題