为了账号安全,请及时绑定邮箱和手机立即绑定

请各位大佬指点!C语言结构体占字节数问题万分感谢

请各位大佬指点!C语言结构体占字节数问题万分感谢

噜噜哒 2019-07-28 12:13:02
今天在刷C语言结构体的一个题,是计算结构体字节数的。搞不清原理,求大佬指点...题:#includeintmain(){typedefstruct{inta;chars[10];}TYPE;TYPEul;inta;chars1[10];printf("%d\n",sizeof(ul));//长度为16}请问为什么结果是16啊?int占4字节,s[10]我原以为占10字节,结果后来知道占1字节。那应该是4+1=5啊。为什么是16呢?
查看完整描述

2 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

这叫做padding。
先说一下,chars[10];确实要占10字节,而不是1字节。
然后继续说padding。padding就是要数据结果中补充几个不表示任何数据的字节,使其中元素的地址可以一定出现的特定的地址上。
这是因为,在很多计算机体系结构中,对不同内存地址的访问速度是不同的。比如,从4的倍数的位置读取一个int(4字节),可能会比从其他地址读取同样长度的字节快,而且可能快很多。(在某些体系结构里,从不是4的倍数的地址读取int甚至会直接导致程序挂掉。)于是,编译器就会尽可能的把int放在4的倍数的地址上。
但是,组成struct之后,比如这里,如果struct长度是14字节,那么当这个struct形成一个数组的时候,必然至少有一半a并不是在4的倍数的地址上的。怎么办呢,编译器于是在这个结构体中增加了两个不表示任何数据的字节(padding),把struct的长度pad到16,这样就可以保证这个struct的数组中,可以把每一个a都放在4的倍数的地址上。
这个实在结尾的padding,padding也可能出现在struct中,如struct{chara;intb;};,a后很有可能会被pad3个字节,最后结构体大小为8字节。
最后,padding是与编译器、操作系统、体系结构有关的。同一段程序在不同的地方可能会有不同的padding结果(从而有不同的大小)。
                            
查看完整回答
反对 回复 2019-07-28
  • 2 回答
  • 0 关注
  • 253 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信