回答編集履歴

7

修正

2017/07/23 12:46

投稿

strike1217
strike1217

スコア651

test CHANGED
@@ -43,7 +43,3 @@
43
43
  (アドレスかと思っていました。わかりにくですね。)
44
44
 
45
45
 
46
-
47
- 実体のあるメンバアクセスと実体のないメンバアクセスとではスタックのアクセス方向が真逆になっていました。
48
-
49
- これを応用してリターンアドレスを獲得しているんですね!!!

6

追記

2017/07/23 12:46

投稿

strike1217
strike1217

スコア651

test CHANGED
@@ -41,3 +41,9 @@
41
41
  実体のないメンバ変数 p->p の中身はアドレスではなく要素でした。
42
42
 
43
43
  (アドレスかと思っていました。わかりにくですね。)
44
+
45
+
46
+
47
+ 実体のあるメンバアクセスと実体のないメンバアクセスとではスタックのアクセス方向が真逆になっていました。
48
+
49
+ これを応用してリターンアドレスを獲得しているんですね!!!

5

追記

2017/07/23 12:42

投稿

strike1217
strike1217

スコア651

test CHANGED
@@ -35,3 +35,9 @@
35
35
  構造体のポインタは実際の構造体とは別物でしたね。
36
36
 
37
37
  実体のない構造体のメンバ変数からアクセスを行うとすでに確保されているメモリ領域へのアクセスが行われるようですね。
38
+
39
+
40
+
41
+ 実体のないメンバ変数 p->p の中身はアドレスではなく要素でした。
42
+
43
+ (アドレスかと思っていました。わかりにくですね。)

4

修正

2017/07/23 12:01

投稿

strike1217
strike1217

スコア651

test CHANGED
@@ -6,9 +6,9 @@
6
6
 
7
7
  なので、実体のない構造体アクセスを行おうとすると(printf("%p, %p, %p\n", &re, p->p, p->t); )
8
8
 
9
- 実体が確保されているメモリ領域は int型+pointer型で12Bしかありません
9
+ 実体が確保されているメモリ領域は int型+pointer型で12Bしかありませんので
10
10
 
11
- よってメンバ変数のアクセスは先頭から8Bとして int型(4B)+ポインタ型(4B)にアクセスしています。
11
+ メンバ変数のアクセスは先頭から8Bとして int型(4B)+ポインタ型(4B)にアクセスしてしまいます。
12
12
 
13
13
  次の8Bは残りのポインタ型4Bとオーバーフローを起こします。
14
14
 

3

修正

2017/07/23 11:47

投稿

strike1217
strike1217

スコア651

test CHANGED
@@ -1,6 +1,6 @@
1
1
  やっとわかりました。
2
2
 
3
- 正確なメモリレイアウトは面倒なので省略しますが、この構造体はメモリ領域として合計16B確保されています。(2番目の構造体)
3
+ 正確なメモリレイアウトは面倒なので省略しますが、この構造体はメモリ領域として合計16Bのメモリ領域を必要としています。(2番目の構造体)
4
4
 
5
5
 
6
6
 

2

追記

2017/07/23 11:46

投稿

strike1217
strike1217

スコア651

test CHANGED
@@ -29,3 +29,9 @@
29
29
  __builtin_frame_address(0)の方はポインタ型に代入していますが、構造体としての実体がありません。
30
30
 
31
31
  ポインタの前には何も確保されていないので、先頭からオフセットが一致しています。
32
+
33
+
34
+
35
+ 構造体のポインタは実際の構造体とは別物でしたね。
36
+
37
+ 実体のない構造体のメンバ変数からアクセスを行うとすでに確保されているメモリ領域へのアクセスが行われるようですね。

1

追記

2017/07/23 11:45

投稿

strike1217
strike1217

スコア651

test CHANGED
@@ -23,3 +23,9 @@
23
23
 
24
24
 
25
25
  いや〜〜〜。とんでもなくわかりにくですね!!
26
+
27
+
28
+
29
+ __builtin_frame_address(0)の方はポインタ型に代入していますが、構造体としての実体がありません。
30
+
31
+ ポインタの前には何も確保されていないので、先頭からオフセットが一致しています。