EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
如下所示,定义了两个结构体,8 i7 ?7 E2 P2 N0 l% |4 o- [- I
然后使用宏 定义了一个地址, 地址通过 sizeof 结构体 进行地址偏移,: h. w( [8 [; h; P
2 \: m) A+ S) ?& S* B, V" I
结果通过打印 这些地址, 发现偏移的地址 不是结构体的size。
7 Y+ R2 S$ F, a2 a" g+ J7 F! [2 x! ^, N. c/ e
请问为什么( T- l6 g4 u0 p7 f, d5 {! o
& X( t4 N9 J& U; t' u% R8 B; B" k
typedef struct9 n. O/ _% ?& \9 ]. v. Y; c
{, T0 t( S v7 l6 ^
uint8 a;$ ?4 n1 B- j8 x3 J! n
uint8 b;
) G2 V2 _3 V t0 W% s} g_test_2_t;
$ g- N' t: V, G) f. z5 g
: L( {/ A6 v, c1 m* Xtypedef struct
$ v2 g$ V" b- ^' M) D" A, i5 p{
3 t O. H5 |; k7 D uint8 d;( g- W5 z6 }, S
uint8 e;
! C% p5 g% D; f- y8 | uint8 f;
- W+ _. Y8 N+ m) U6 l) o} g_test_3_t;
[8 c/ a/ k- g# y. B7 R! r
" F$ L9 d% [: b. r A#define g_test (g_test_2_t *)(0xbfc0bfb5)
; G5 k, S0 A4 p
5 C, H+ v8 z1 T#define u8_g2 ((uint8 *)(g_test+sizeof(g_test_2_t)))
! q. B* K6 ]& k% ]' u1 @. E#define g2_g2 ((g_test_2_t *)(g_test+sizeof(g_test_2_t)))
% t4 f$ k& X ~% a! v$ p* A1 b" D2 K( ]
#define u8_g3 ((uint8 *)(g_test+sizeof(g_test_3_t)))
: m* |' U5 G7 k; ^: u+ S; V8 z Q#define g3_g3 ((g_test_3_t *)(g_test+sizeof(g_test_3_t)))
9 C8 f& t& m) R. f: P% A/ R& {7 h" y" m
使用sizeof进行地址偏移后,出现的问题:
. I2 u! j$ x# ^- A
) Y# j4 e: x' _. O" m(181024_10:10:55.315)<I> g_test:0xbfc0bfb50 x/ ~, H$ P, J8 W3 D
(181024_10:10:55.315)<I> u8_g2:0xbfc0bfb9
- Z7 }" u: ^5 ]1 e* b(181024_10:10:55.315)<I> g2_g2:0xbfc0bfb9; h! j$ \8 M. H5 Q
(181024_10:10:55.315)<I> u8_g3:0xbfc0bfbb. P/ n% w& {: }) U) }7 f5 v
(181024_10:10:55.315)<I> g3_g3:0xbfc0bfbb
; @- N% S% E9 O(181024_10:10:55.315) sizeof g_test_2_t:0x00000002) G! E& m4 z$ z" s* {) F
(181024_10:10:55.315) sizeof g_test_3_t:0x000000037 h) F' F, e2 M ~+ B
- q6 `0 j: U2 S# n7 F7 a' h
如打印所示,
' W4 ~) x+ G4 Z' au8_g2 按道理偏移sizeof(g_test_2_t) 应该只是偏移2byte 结果,显示偏移了4byte 。 r! W2 F6 Q5 V& s! b* y3 R
u8_g3 按道理偏移sizeof(g_test_3_t) 应该只是偏移3byte 结果,显示偏移了6byte 。
# a6 ~ u# i' F0 t2 z5 g这到底是为什么呢?
: z0 a# ^+ P+ J; G. r$ Y7 j, B! [, T/ n+ J& i
+ u# ^2 x ?# D, ~) `
$ o3 k) Q6 Z6 ]后面我又做了 两个测试# N9 D. X: `1 z1 o8 k8 Q
修改#define g_test (uint8 *)(0xbfc0bfb5)
]; D( m0 G% l% |- T/ G打印: D) |: m4 Z' n0 B. F6 B
$ h4 i- T& r) `0 L9 d: i8 ? Y(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 * C7 X* C W" B8 [. H: E5 M [
+ P1 T" g" u m# L% i
修改#define g_test (g_test_3_t *)(0xbfc0bfb5)
! g; L4 d5 [3 {; x. T打印:
4 Y$ c6 j0 L# |1 B' P% }) [( [: x3 }7 P" d4 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 所以问题应该是理解不透彻,
3 e: v3 h |5 D/ _. ^$ M, [$ ^. \. I# Q: u
+ d" s5 F4 C+ b- K1 M" g4 s
n* Z6 h5 i# l6 N! l |6 ~sizeof 的运算在这里是对的,它在这里只决定了偏移单位的个数。 但偏移的大小即关系到偏移单位的个数也同样关系到偏移的单位 的大小( g_test 的大小), 偏移大小 = 偏移单位个数 X 偏移单位大小
( h* ]" W7 f' J. B9 C2 v! ` c |