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

回答編集履歴

7

修正

2017/07/23 12:46

投稿

strike1217
strike1217

スコア651

answer CHANGED
@@ -20,6 +20,3 @@
20
20
 
21
21
  実体のないメンバ変数 p->p の中身はアドレスではなく要素でした。
22
22
  (アドレスかと思っていました。わかりにくですね。)
23
-
24
- 実体のあるメンバアクセスと実体のないメンバアクセスとではスタックのアクセス方向が真逆になっていました。
25
- これを応用してリターンアドレスを獲得しているんですね!!!

6

追記

2017/07/23 12:46

投稿

strike1217
strike1217

スコア651

answer CHANGED
@@ -19,4 +19,7 @@
19
19
  実体のない構造体のメンバ変数からアクセスを行うとすでに確保されているメモリ領域へのアクセスが行われるようですね。
20
20
 
21
21
  実体のないメンバ変数 p->p の中身はアドレスではなく要素でした。
22
- (アドレスかと思っていました。わかりにくですね。)
22
+ (アドレスかと思っていました。わかりにくですね。)
23
+
24
+ 実体のあるメンバアクセスと実体のないメンバアクセスとではスタックのアクセス方向が真逆になっていました。
25
+ これを応用してリターンアドレスを獲得しているんですね!!!

5

追記

2017/07/23 12:42

投稿

strike1217
strike1217

スコア651

answer CHANGED
@@ -16,4 +16,7 @@
16
16
  ポインタの前には何も確保されていないので、先頭からオフセットが一致しています。
17
17
 
18
18
  構造体のポインタは実際の構造体とは別物でしたね。
19
- 実体のない構造体のメンバ変数からアクセスを行うとすでに確保されているメモリ領域へのアクセスが行われるようですね。
19
+ 実体のない構造体のメンバ変数からアクセスを行うとすでに確保されているメモリ領域へのアクセスが行われるようですね。
20
+
21
+ 実体のないメンバ変数 p->p の中身はアドレスではなく要素でした。
22
+ (アドレスかと思っていました。わかりにくですね。)

4

修正

2017/07/23 12:01

投稿

strike1217
strike1217

スコア651

answer CHANGED
@@ -2,8 +2,8 @@
2
2
  正確なメモリレイアウトは面倒なので省略しますが、この構造体はメモリ領域として合計16Bのメモリ領域を必要としています。(2番目の構造体)
3
3
 
4
4
  なので、実体のない構造体アクセスを行おうとすると(printf("%p, %p, %p\n", &re, p->p, p->t); )
5
- 実体が確保されているメモリ領域は int型+pointer型で12Bしかありません
5
+ 実体が確保されているメモリ領域は int型+pointer型で12Bしかありませんので
6
- よってメンバ変数のアクセスは先頭から8Bとして int型(4B)+ポインタ型(4B)にアクセスしています。
6
+ メンバ変数のアクセスは先頭から8Bとして int型(4B)+ポインタ型(4B)にアクセスしてしまいます。
7
7
  次の8Bは残りのポインタ型4Bとオーバーフローを起こします。
8
8
 
9
9
  ある意味、共用体のようなものですね。(少しだけずれていますが・・・)

3

修正

2017/07/23 11:47

投稿

strike1217
strike1217

スコア651

answer CHANGED
@@ -1,5 +1,5 @@
1
1
  やっとわかりました。
2
- 正確なメモリレイアウトは面倒なので省略しますが、この構造体はメモリ領域として合計16B確保されています。(2番目の構造体)
2
+ 正確なメモリレイアウトは面倒なので省略しますが、この構造体はメモリ領域として合計16Bのメモリ領域を必要としています。(2番目の構造体)
3
3
 
4
4
  なので、実体のない構造体アクセスを行おうとすると(printf("%p, %p, %p\n", &re, p->p, p->t); )
5
5
  実体が確保されているメモリ領域は int型+pointer型で12Bしかありません。

2

追記

2017/07/23 11:46

投稿

strike1217
strike1217

スコア651

answer CHANGED
@@ -13,4 +13,7 @@
13
13
  いや〜〜〜。とんでもなくわかりにくですね!!
14
14
 
15
15
  __builtin_frame_address(0)の方はポインタ型に代入していますが、構造体としての実体がありません。
16
- ポインタの前には何も確保されていないので、先頭からオフセットが一致しています。
16
+ ポインタの前には何も確保されていないので、先頭からオフセットが一致しています。
17
+
18
+ 構造体のポインタは実際の構造体とは別物でしたね。
19
+ 実体のない構造体のメンバ変数からアクセスを行うとすでに確保されているメモリ領域へのアクセスが行われるようですね。

1

追記

2017/07/23 11:45

投稿

strike1217
strike1217

スコア651

answer CHANGED
@@ -10,4 +10,7 @@
10
10
 
11
11
  最初のint型reを long long intとして8B確保すると値はズレずに正確に16Bと一致します。
12
12
 
13
- いや〜〜〜。とんでもなくわかりにくですね!!
13
+ いや〜〜〜。とんでもなくわかりにくですね!!
14
+
15
+ __builtin_frame_address(0)の方はポインタ型に代入していますが、構造体としての実体がありません。
16
+ ポインタの前には何も確保されていないので、先頭からオフセットが一致しています。