找回密码
 注册
关于网站域名变更的通知
查看: 108|回复: 2
打印 上一主题 下一主题

使用sizeof 进行地址偏移出现问题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-1-12 11:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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 O
6 [# t2 g; `( t" P. g  w9 d' U9 t

- W2 m$ ~" S+ ?. i2 v! o
sizeof 的运算在这里是对的,它在这里只决定了偏移单位的个数。
但偏移的大小即关系到偏移单位的个数也同样关系到偏移的单位 的大小( g_test 的大小),
偏移大小 = 偏移单位个数 X 偏移单位大小

5 Q9 D; ?* m: ^
  • TA的每日心情
    开心
    2022-12-27 15:07
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2022-1-12 13:18 | 只看该作者
    除了8位机,其它都不是按1字节对齐的
    : j+ c( \, L5 x5 w想要强制按1字节对齐,在结构体定义前加一行:5 U8 k. K) m' |" o
    #pragma pack(1) //1字节对齐。在和外部交换参数结构体时用到

    该用户从未签到

    3#
    发表于 2022-1-12 14:40 | 只看该作者
    这是一个32bit 的cpu ,你的意思是 字节对齐导致的? 可以怎么算也不是翻倍啊?
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-6-20 01:13 , Processed in 0.078125 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表