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

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

[复制链接]

该用户从未签到

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

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

    [LV.1]初来乍到

    2#
    发表于 2022-1-12 13:18 | 只看该作者
    除了8位机,其它都不是按1字节对齐的# `/ |% ?0 }% D' F7 O
    想要强制按1字节对齐,在结构体定义前加一行:4 V* g, _8 p8 e( ?" e
    #pragma pack(1) //1字节对齐。在和外部交换参数结构体时用到

    该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-10-9 09:07 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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