EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
如下所示,定义了两个结构体,4 F2 h6 V/ b, Z8 y
然后使用宏 定义了一个地址, 地址通过 sizeof 结构体 进行地址偏移,
8 X3 O2 O8 Y, ~6 s8 n) n2 t4 H) B
6 E( d H' s+ O3 Z结果通过打印 这些地址, 发现偏移的地址 不是结构体的size。
5 m+ J4 ]% _, K9 O6 l9 I5 b: F- s. p f2 F- J2 {
请问为什么- @0 h0 z' o9 S6 g/ U: \
0 @4 r# ~3 f7 s; c; h; ^# t$ rtypedef struct
5 p3 `; R+ c, O# C! [, n{
/ R; d$ }. E* d9 f) i, e uint8 a;
5 ^2 k% z, }' D! I+ S T uint8 b;* S( x+ ^- W/ l2 p, q2 S
} g_test_2_t;& E% W- F! M/ _
1 D5 s8 p8 J0 _2 }$ p( A; ], }) C
typedef struct9 f' m3 B+ V- O6 P: M5 U
{
0 V+ v4 }6 p1 `7 k uint8 d;
( T# T/ ~0 Y: G- G) U7 \ uint8 e;
2 a0 m$ G/ F# O uint8 f;
3 \% Z: Y5 G* O A* \% e} g_test_3_t;
- M. ~' B" |. C1 c7 h0 p, d$ F0 g
#define g_test (g_test_2_t *)(0xbfc0bfb5)
0 B1 Z3 E5 w8 b. J4 d% x6 z8 n% ]4 p$ U' q# m5 `# P
#define u8_g2 ((uint8 *)(g_test+sizeof(g_test_2_t)))6 P/ z$ s5 ]. j$ a
#define g2_g2 ((g_test_2_t *)(g_test+sizeof(g_test_2_t)))6 S0 C5 b" b; ^" Z' \/ D: Y
- B1 ]( V) w, [, H$ a/ t7 U#define u8_g3 ((uint8 *)(g_test+sizeof(g_test_3_t)))
1 ^( K A" {+ D# X#define g3_g3 ((g_test_3_t *)(g_test+sizeof(g_test_3_t)))
- z, R& d% I6 P J
2 w C* c3 ^, p5 _! w使用sizeof进行地址偏移后,出现的问题:( W7 L2 ]; M |$ }
2 D2 \; p( ]7 I8 f
(181024_10:10:55.315)<I> g_test:0xbfc0bfb5
: i& X0 U' a8 b0 m. }% f(181024_10:10:55.315)<I> u8_g2:0xbfc0bfb9
8 E% ^- g/ C1 b6 t1 l(181024_10:10:55.315)<I> g2_g2:0xbfc0bfb9) \" y7 Q) n" o* G/ z. ]* j* N+ p
(181024_10:10:55.315)<I> u8_g3:0xbfc0bfbb+ ~6 a3 y7 u7 e. \
(181024_10:10:55.315)<I> g3_g3:0xbfc0bfbb/ K4 j( H; {% `! _) d- F. A, H
(181024_10:10:55.315) sizeof g_test_2_t:0x00000002! L. |0 P# {8 r) c8 ?9 _ E
(181024_10:10:55.315) sizeof g_test_3_t:0x000000030 ~0 ]5 C- Z# Q! u
/ R y' d& p7 e
如打印所示,
& {1 H" ?) Y% x$ Qu8_g2 按道理偏移sizeof(g_test_2_t) 应该只是偏移2byte 结果,显示偏移了4byte 。2 p2 T* g! k" W! x3 A$ T' T
u8_g3 按道理偏移sizeof(g_test_3_t) 应该只是偏移3byte 结果,显示偏移了6byte 。
1 _" k+ P& p5 V% W2 P# a/ E这到底是为什么呢?
0 O9 {* C& Q6 n! H5 R+ `3 R/ F! G, g9 D9 M5 ]9 W Y
! h$ U a2 v4 u% `0 E% H0 \
, Z: B7 f: |' ]3 o% x! q+ g9 _后面我又做了 两个测试
9 d0 x3 \$ m9 p6 X* K+ W3 b修改#define g_test (uint8 *)(0xbfc0bfb5). Y7 | O9 y: I+ x8 B
打印:' w1 v! L0 j/ m5 _" E
. a) R. F0 X4 s+ D8 }(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
/ C/ X8 g5 k( ?* t6 |- m# X
) b9 v. n- i: L& b: J# M修改#define g_test (g_test_3_t *)(0xbfc0bfb5)
! G) W" g; s) k: H" M打印:0 o7 B! {3 Q; P/ i/ w7 o
1 A1 |5 j" N/ m) R4 ]; g
(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 所以问题应该是理解不透彻,
' s+ {, B, ]6 S- n
$ {1 o r f8 X
5 r' }2 z9 e9 u/ m: t
+ K v5 p, `6 h7 nsizeof 的运算在这里是对的,它在这里只决定了偏移单位的个数。 但偏移的大小即关系到偏移单位的个数也同样关系到偏移的单位 的大小( g_test 的大小), 偏移大小 = 偏移单位个数 X 偏移单位大小
; F% e6 B! R( D9 V) f5 r% V |