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

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

[复制链接]

该用户从未签到

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

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 n
sizeof 的运算在这里是对的,它在这里只决定了偏移单位的个数。
但偏移的大小即关系到偏移单位的个数也同样关系到偏移的单位 的大小( g_test 的大小),
偏移大小 = 偏移单位个数 X 偏移单位大小

; F% e6 B! R( D9 V) f5 r% V
  • TA的每日心情
    开心
    2022-12-27 15:07
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2022-1-12 13:18 | 只看该作者
    除了8位机,其它都不是按1字节对齐的( S5 c. _, L& g
    想要强制按1字节对齐,在结构体定义前加一行:; k* m" X* E3 f! Y4 ?: s4 H
    #pragma pack(1) //1字节对齐。在和外部交换参数结构体时用到

    该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-7-18 17:40 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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