完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
下所示,定义了两个结构体,
然后使用宏 定义了一个地址, 地址通过 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) g_test:0xbfc0bfb5 (181024_10:10:55.315) u8_g2:0xbfc0bfb9 (181024_10:10:55.315) g2_g2:0xbfc0bfb9 (181024_10:10:55.315) u8_g3:0xbfc0bfbb (181024_10:10:55.315) 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)g_test:0xbfc0bfb5 (181024_10:39:49.283)u8_g2:0xbfc0bfb7 (181024_10:39:49.283)g2_g2:0xbfc0bfb7 (181024_10:39:49.283)u8_g3:0xbfc0bfb8 (181024_10:39:49.283)g3_g3:0xbfc0bfb8 (181024_10:39:49.283)sizeof g2:0x00000002 (181024_10:39:49.283)sizeof g3:0x00000003 修改#define g_test (g_test_3_t *)(0xbfc0bfb5) 打印: (181024_11:07:44.918)g_test:0xbfc0bfb5 (181024_11:07:44.918)u8_g2:0xbfc0bfbb (181024_11:07:44.918)g2_g2:0xbfc0bfbb (181024_11:07:44.918)u8_g3:0xbfc0bfbe (181024_11:07:44.918)g3_g3:0xbfc0bfbe (181024_11:07:44.918) sizeofg2:0x00000002 (181024_11:07:44.918) sizeof g3:0x00000003 所以问题应该是理解不透彻,sizeof 的运算在这里是对的,它在这里只决定了偏移单位的个数。 但偏移的大小即关系到偏移单位的个数也同样关系到偏移的单位 的大小( g_test 的大小), 偏移大小 = 偏移单位个数 X 偏移单位大小
|
|
相关推荐
9个回答
|
|
|
|
|
|
这是一个32bit 的cpu ,你的意思是 字节对齐导致的? 可以怎么算也不是翻倍啊?
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct{ char cVar1; int iVar2; }Test_Typedef; #define OFFSET_STRUCT(st, mem) ((int)(&((Test_Typedef*)0)->mem)) |
|
|
|
typedef struct
{ 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都是必须的。 |
|
|
|
指针加整数,偏移量并不是简单的增加了整数个字节,而是增加了(指针的类型大小×整数)个字节。
g_test是个指针,类型大小为2,加上 sizeof(g_test_2_t),值为2,偏移量增加了 2×2 = 4 字节。 g_test + sizeof(g_test_2_t) 在语义上与 &g_test[sizeof(g_test_2_t)] 是相同的。 |
|
|
|
我是来学习的~~~~~~~~~
|
|
|
|
指针偏移量 = 指针指向数据类型大小 * 偏移个数
(g_test_2_t *)指针指向数据类型为结构体g_test_2_t,结构体数据类型大小为2 偏移个数为sizeof(g_test_2_t)为2,所以指针偏移量为2*2 偏移个数为sizeof(g_test_3_t)为3,所以指针偏移量为2*3 (uint8 *)指针指向数据类型为unsigned char,数据类型大小为1 偏移个数为sizeof(g_test_2_t)为2,所以指针偏移量为1*2 偏移个数为sizeof(g_test_3_t)为3,所以指针偏移量为1*3 (g_test_3_t*)指针指向数据类型为结构体g_test_3_t,结构体数据类型大小为3 偏移个数为sizeof(g_test_2_t)为2,所以指针偏移量为3*2 偏移个数为sizeof(g_test_3_t)为3,所以指针偏移量为3*3 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
690 浏览 0 评论
735 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
624 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
1099 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1092 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11793 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 01:12 , Processed in 0.913584 second(s), Total 87, Slave 70 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号