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

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

[复制链接]

该用户从未签到

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

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
  • TA的每日心情
    开心
    2022-12-27 15:07
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2022-1-12 13:18 | 只看该作者
    除了8位机,其它都不是按1字节对齐的9 a% ?8 I- K  o& M$ V& r* b% Y
    想要强制按1字节对齐,在结构体定义前加一行:
    3 V6 E/ ^4 q5 D  U3 Z! Q/ }#pragma pack(1) //1字节对齐。在和外部交换参数结构体时用到

    该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

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

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

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

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