teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追加

2020/05/13 02:52

投稿

kazuhi
kazuhi

スコア15

answer CHANGED
@@ -47,4 +47,8 @@
47
47
 
48
48
  16進数はあくまで値を表現する方法で、値が16進数で入ってのでは無いと思います。
49
49
  今回のポインタの場合は、64bitのサイズのアドレスの値で、
50
- 16進数で表すと 0000000000000000~FFFFFFFFFFFFFFFFで表現されるという事です。
50
+ 16進数で表すと 0000000000000000~FFFFFFFFFFFFFFFFで表現されるという事です。
51
+
52
+ > なので一回目に大きな値が表示されるのはわかるのですが、
53
+
54
+ 上記も少し違い、たまたま入っていた値でメモリ領域の先頭のアドレス値でもありません。

1

追加

2020/05/13 02:52

投稿

kazuhi
kazuhi

スコア15

answer CHANGED
@@ -26,6 +26,14 @@
26
26
 
27
27
  この処理系の場合、int型のサイズは32bit(0~FFFFFFFF)と思います。サイズは4バイト必要です。
28
28
  「sizeof(int)*5」としていますので、int型を5個分、4(バイト)×5=20バイトの領域を確保しています。
29
+
30
+ > for(int i=0;i<10;i++){
31
+ printf("%d\n",p[i]); //←ここのp[1]では0と表示される
32
+ }
33
+
34
+ 上記では確保した領域以外の場所にアクセスしている事になります。本来なら問題が発生します。
35
+ (今回は参照しているだけなのでたまたま問題にならなかっただけ。そもそも値が設定されていないので全て無意味な値です)
36
+
29
37
  p[0]は、pが示すアドレスの先頭(0番目)のintの値を参照し、p[1]はその次(1番目)intの値を
30
38
  参照します。pが示す先頭アドレスから4バイトプラスされた位置にあります。
31
39
  (p+4ではありません。pが示すアドレスの値+4という事です。)