下所示,定义了两个结构体,
然后使用宏 定义了一个地址, 地址通过 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 偏移单位大小
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
{
g_test_2_t var1;
unsigned char rev[1];
g_test_3_t var2;
} struct_var ;
#define g_test (struct_var *)(0xbfc0bfb5)
g_test->var1.a 这样来使用才能保证var1和var2是挨着的,你那样怎么保证两个变量是挨着的?
不过无论如何pack都是必须的。
一周热门 更多>