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

2019-07-15 07:54发布

下所示,定义了两个结构体,
然后使用宏 定义了一个地址, 地址通过 sizeof 结构体 进行地址偏移,

结果通过打印 这些地址,   发现偏移的地址 不是结构体的size。

请问为什么

typedef struct
{
     uint8 a;
     uint8 b;
} g_test_2_t;

typedef struct
{
     uint8 d;
     uint8 e;
     uint8 f;
} g_test_3_t;

#define g_test                        (g_test_2_t *)(0xbfc0bfb5)

#define u8_g2        ((uint8 *)(g_test+sizeof(g_test_2_t)))
#define g2_g2        ((g_test_2_t *)(g_test+sizeof(g_test_2_t)))

#define u8_g3        ((uint8  *)(g_test+sizeof(g_test_3_t)))
#define g3_g3        ((g_test_3_t *)(g_test+sizeof(g_test_3_t)))

使用sizeof进行地址偏移后,出现的问题:

(181024_10:10:55.315)<I>         g_test:0xbfc0bfb5
(181024_10:10:55.315)<I>         u8_g2:0xbfc0bfb9
(181024_10:10:55.315)<I>         g2_g2:0xbfc0bfb9
(181024_10:10:55.315)<I>         u8_g3:0xbfc0bfbb
(181024_10:10:55.315)<I>         g3_g3:0xbfc0bfbb
(181024_10:10:55.315)                sizeof g_test_2_t:0x00000002
(181024_10:10:55.315)                sizeof g_test_3_t:0x00000003

如打印所示,
u8_g2 按道理偏移sizeof(g_test_2_t) 应该只是偏移2byte 结果,显示偏移了4byte 。
u8_g3 按道理偏移sizeof(g_test_3_t) 应该只是偏移3byte 结果,显示偏移了6byte 。
这到底是为什么呢?



后面我又做了 两个测试
修改#define g_test                        (uint8  *)(0xbfc0bfb5)
打印:

(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

修改#define g_test                        (g_test_3_t  *)(0xbfc0bfb5)
打印:

(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所以问题应该是理解不透彻,



sizeof 的运算在这里是对的,它在这里只决定了偏移单位的个数。 但偏移的大小即关系到偏移单位的个数也同样关系到偏移的单位 的大小( g_test 的大小),偏移大小 = 偏移单位个数 X 偏移单位大小
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。