EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
如下所示,定义了两个结构体,
: s3 g: F# @2 Q0 d+ H然后使用宏 定义了一个地址, 地址通过 sizeof 结构体 进行地址偏移,
5 ~2 H2 a/ X- E0 ?: x5 x+ ^" ?2 }+ Z- t9 i) `# \ `
结果通过打印 这些地址, 发现偏移的地址 不是结构体的size。8 N1 d) ^5 R" w8 i5 ?& Q) I! D( K, B
. R0 a4 D( a3 V9 o" n1 I s3 G
请问为什么
9 m% \3 a4 I' }8 H) y# u9 J& C0 T9 o9 M. I
typedef struct2 p1 R, k# d& A# X1 p. ^
{
. }% o% j# H Z) g; \( v T uint8 a;
' F& n" g) e! `. x3 r- { uint8 b;
/ t4 x9 ~+ L2 G5 V} g_test_2_t;6 Z* S% M4 `2 q) X6 z/ v
3 l! p8 P0 Q; X# j
typedef struct
; t$ }7 `" c/ h9 S' F{8 {% J! X o+ h
uint8 d;$ Q0 @* q) c; U8 M4 j5 l
uint8 e;7 o6 f" x# T% n& d9 v: N& z s
uint8 f;: Y7 {9 K$ W p1 D
} g_test_3_t;
! m: S* X; ^2 i5 F
# k! m6 i! U/ b3 `. Z#define g_test (g_test_2_t *)(0xbfc0bfb5)4 I7 C3 X! e# R! X6 I2 F
7 B, v' h' i5 l$ ?( }8 w
#define u8_g2 ((uint8 *)(g_test+sizeof(g_test_2_t)))
- X8 M# F: ?7 F6 X `+ ^! q# B H, {#define g2_g2 ((g_test_2_t *)(g_test+sizeof(g_test_2_t)))/ p6 [8 j! h2 I% p2 P5 E& u, q
8 Y0 g: Y+ d( T: S! O#define u8_g3 ((uint8 *)(g_test+sizeof(g_test_3_t)))2 Q: w0 {' x1 ~* ^5 z! u7 G
#define g3_g3 ((g_test_3_t *)(g_test+sizeof(g_test_3_t)))
( w2 \9 }( z9 D0 s3 I4 a) |$ {3 Z9 P& Q% K: [; {0 ]6 B
使用sizeof进行地址偏移后,出现的问题:
. W, ] Y* B1 A5 Q9 G% J6 t" ~% j# {( z' c
(181024_10:10:55.315)<I> g_test:0xbfc0bfb50 w0 ^/ Y y/ d! D4 V, n8 ?' k
(181024_10:10:55.315)<I> u8_g2:0xbfc0bfb9
" H7 `/ n3 X: d3 [+ ~(181024_10:10:55.315)<I> g2_g2:0xbfc0bfb9
! g5 O4 d, T2 |2 E& V' H8 {1 P(181024_10:10:55.315)<I> u8_g3:0xbfc0bfbb
2 X2 N+ ~2 K7 R5 Y4 L& l(181024_10:10:55.315)<I> g3_g3:0xbfc0bfbb d- I6 g/ b/ v: m9 d. b
(181024_10:10:55.315) sizeof g_test_2_t:0x00000002; k {5 n4 F6 z7 r
(181024_10:10:55.315) sizeof g_test_3_t:0x000000033 N1 C' K9 {9 i3 S" u
! \8 u/ z( ]' o如打印所示,
! L2 C' O1 M7 q( L& t9 R" Bu8_g2 按道理偏移sizeof(g_test_2_t) 应该只是偏移2byte 结果,显示偏移了4byte 。4 \* W0 f f8 s z l/ U9 J/ ?% A( t
u8_g3 按道理偏移sizeof(g_test_3_t) 应该只是偏移3byte 结果,显示偏移了6byte 。
5 U% [( z4 D- r. J; m. w这到底是为什么呢?: H% t8 l$ L6 v: o+ i
6 H* g' p( U+ Q8 T7 K7 u# h
# q4 G- ^. Q& B M4 R" ~9 Y q( G8 p7 u
后面我又做了 两个测试" {5 R9 ]& k7 E! G
修改#define g_test (uint8 *)(0xbfc0bfb5)
! Z/ h% X5 `7 B: U打印:
( {7 N! b% b" ^7 a7 O0 V4 P5 ]& V5 t) Z
(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
0 a0 O& N- K) f' L% l3 U
8 y: f( b, g9 @ d: P# P( H修改#define g_test (g_test_3_t *)(0xbfc0bfb5) Q4 l' Z" J c/ y& |
打印:. Z$ Q9 @$ K9 |0 Q5 j H2 ]3 P8 }
" u4 ~* l! z/ U) H% ?7 y, f
(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 所以问题应该是理解不透彻,
5 S2 P. x# g+ w& a
/ T6 n( Z" L) Q, f! O
! N- j: Y( w+ M: u3 d$ ?1 h! u& ~+ O' t- W! }* C g$ e
sizeof 的运算在这里是对的,它在这里只决定了偏移单位的个数。 但偏移的大小即关系到偏移单位的个数也同样关系到偏移的单位 的大小( g_test 的大小), 偏移大小 = 偏移单位个数 X 偏移单位大小
4 \3 ?% h4 w& Y4 V f' T |