EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
如下所示,定义了两个结构体,# I' b5 A/ H0 G! [; q% S7 L2 G
然后使用宏 定义了一个地址, 地址通过 sizeof 结构体 进行地址偏移,
) }, G# G% u" U U% S/ A( Z' t4 v" @1 ^: s
结果通过打印 这些地址, 发现偏移的地址 不是结构体的size。
3 f9 p0 L1 G! d+ s. D: x$ Y1 }. d/ b
请问为什么
& `# B! t6 Y; A# \% g' r1 C. [& R' K; [6 n P7 x; h/ M
typedef struct
H8 L& z1 _4 y: D& a{
; T3 g: u( {- @9 L- f) w uint8 a;
7 A0 [2 Y6 _7 v# @; Y+ ?6 |. K/ _ uint8 b;# N% P% Q& _, \" B; F% c6 O: a5 |
} g_test_2_t; y( W- r. G- O7 _+ ^
6 t6 o6 |1 w2 A; [! stypedef struct/ y; e# J% s1 X! u
{' E" B. R1 w7 V. D. V
uint8 d;% Z; E+ _6 `/ `! I: F
uint8 e;
& l/ x! u a0 W4 ~ uint8 f;) L* @% n% x% z6 j, m
} g_test_3_t;, t+ o' g7 { n6 x) V- p' [+ `
$ ~; G6 g. D. M7 |#define g_test (g_test_2_t *)(0xbfc0bfb5)
& T7 G! l* H' o+ b- p3 s) p: y9 ^* Q6 p. r/ R M; k% c8 i) y. `
#define u8_g2 ((uint8 *)(g_test+sizeof(g_test_2_t)))
/ y9 M) p4 s5 y#define g2_g2 ((g_test_2_t *)(g_test+sizeof(g_test_2_t)))
* j4 P8 K. O1 P, N% u) v% P* G f* [; ^
#define u8_g3 ((uint8 *)(g_test+sizeof(g_test_3_t)))' \; G) ]$ E# Z& A4 G: v
#define g3_g3 ((g_test_3_t *)(g_test+sizeof(g_test_3_t)))# l1 Q4 [& O- Q+ h* X+ i1 i
" y2 e7 u; ^3 X5 F* F! K$ q% z
使用sizeof进行地址偏移后,出现的问题:
3 @! C6 t. K" t% N/ q9 `( o z% ^( k0 F x v
(181024_10:10:55.315)<I> g_test:0xbfc0bfb5" S( q0 A! r: @9 J' ^% g% U6 g
(181024_10:10:55.315)<I> u8_g2:0xbfc0bfb9
. m, }# | t0 ^; _$ K8 k(181024_10:10:55.315)<I> g2_g2:0xbfc0bfb9' [. v3 _6 ~8 Q3 r$ j- [
(181024_10:10:55.315)<I> u8_g3:0xbfc0bfbb
8 t* R+ P, u' Q2 f4 L: c5 t; H& j(181024_10:10:55.315)<I> g3_g3:0xbfc0bfbb% O5 @* ]# J" c& J5 L
(181024_10:10:55.315) sizeof g_test_2_t:0x00000002' `. q9 D" R4 t# L
(181024_10:10:55.315) sizeof g_test_3_t:0x00000003 E8 k# q' c7 }
5 ~( n+ }- @; B/ A9 g9 ?4 @
如打印所示,( U2 Q6 V, C0 w5 _: Q7 K) p1 c7 F" p
u8_g2 按道理偏移sizeof(g_test_2_t) 应该只是偏移2byte 结果,显示偏移了4byte 。4 h8 q2 t [9 l, s' _
u8_g3 按道理偏移sizeof(g_test_3_t) 应该只是偏移3byte 结果,显示偏移了6byte 。
" e3 P9 Z {! z! I这到底是为什么呢?
: l! a* h; Z; E" p" v9 D ?* ]. H! B
- G l4 E/ N2 L
; q. m: }6 g/ B" e* N: E1 a后面我又做了 两个测试0 o6 o( k$ I$ w) [& r) j
修改#define g_test (uint8 *)(0xbfc0bfb5)
: u2 Y2 _5 I2 ` g打印:
! H0 o) p6 l3 T7 |( e
3 N$ u8 a" h' ~(181024_10:39:49.279)<I>g_test:0xbfc0bfb5 (181024_10:39:49.283)<I>u8_g2:0xbfc0bfb7 (181024_10:39:49.283)<I>g2_g2:0xbfc0bfb7 (181024_10:39:49.283)<I>u8_g3:0xbfc0bfb8 (181024_10:39:49.283)<I>g3_g3:0xbfc0bfb8 (181024_10:39:49.283)<I>sizeof g2:0x00000002 (181024_10:39:49.283)<I>sizeof g3:0x00000003 3 R: J5 K) ~& L0 }0 m
, f! H0 W4 f* F+ _) ?* s8 U修改#define g_test (g_test_3_t *)(0xbfc0bfb5)) M" o: K& K; O& v! ^
打印:
& ?; M c: \; Y, @- o: c2 k% M7 r1 d$ v
(181024_11:07:44.918)<I>g_test:0xbfc0bfb5 (181024_11:07:44.918)<I>u8_g2:0xbfc0bfbb (181024_11:07:44.918)<I>g2_g2:0xbfc0bfbb (181024_11:07:44.918)<I>u8_g3:0xbfc0bfbe (181024_11:07:44.918)<I>g3_g3:0xbfc0bfbe (181024_11:07:44.918) sizeofg2:0x00000002 (181024_11:07:44.918) sizeof g3:0x00000003 所以问题应该是理解不透彻,' }" Q$ [8 f' {
( v) c0 l: P4 y! h& s% O3 H, p. c5 O6 [# t2 g; `( t" P. g w9 d' U9 t
- W2 m$ ~" S+ ?. i2 v! osizeof 的运算在这里是对的,它在这里只决定了偏移单位的个数。 但偏移的大小即关系到偏移单位的个数也同样关系到偏移的单位 的大小( g_test 的大小), 偏移大小 = 偏移单位个数 X 偏移单位大小
5 Q9 D; ?* m: ^ |