本帖最后由 suxilong 于 2018-10-24 11:09 编辑
如下所示,定义了两个结构体,
然后使用宏 定义了一个地址, 地址通过 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 偏移单位大小
|