关于结构体中成员变量的地址偏移量
2018-06-18 03:59:32来源:未知 阅读 ()
最近遇到一个题目是关于回答结构体成员变量地址偏移量的,实际运行的时候出乎我自己的想象!
看看以下结构体实例truct:
struct trc{
char char_i;
short short_i;
int int_i;
long long_i;
char char_j;
int int_j;
} truct;
首先,我自然地认为,char占用一个字节,short占用2个字节,int占用4个字节,所以long会占用8个字节,没错吧?但是在我的嵌入式MIPS上运行测试程序可以知道long实际上只是占用4个字节!
然后假设结构体truct的地址是0x30000000,那么它也是truct.char_i的地址,truct.short_i的地址是0x30000001,以此类推,0x30000003,0x30000003, 0x30000007,0x3000000b, 0x3000000c。但实际运行的结果却是truct.short_i的地址为0x30000002,truct.int_i的地址为0x30000004,truct.long_i的地址为0x30000008,truct.char_j的地址为0x3000000c,truct.int_j的地址为0x30000010。所以是,本来以为short_i的地址偏移量是1,但结果却是2;本来以为int_j的地址偏移量是在char_j的地址偏移量基础上加上1,结果却是加上4。网上查了一下,才发现结构体存储变量的地址对齐有两个规则:1.结构体中成员变量的地址偏移量必须是该成员大小的整数倍 2.结构体大小必须是所有成员大小的整数倍。所以是,由于short_i占用2个字节,所以它的地址偏移量不能是1,而应该是2;由于int_j占用4个字节,所以char_j的地址偏移量加上4作为4的整数倍,才能是int_j的地址偏移量。按照该原则,整个结构体的大小必须是4的整数倍。目前的结构体大小是20。如果我把int_j的类型改为char,结果int_j的偏移量变成了0x3000000d,而结构体的大小变成了16,而不是12(后面填充了4个字节)。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 关于各种不同开发语言之间数据加密方法(DES,RSA等)的互通的 2020-06-07
- C语言程序结构 2020-05-31
- 数据结构—链表 2020-05-29
- C++17结构化绑定 2020-05-15
- 关于使用ffmpeg的一些牢骚 2020-05-08
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash