今天在刷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结果(从而有不同的大小)。
添加回答
举报
0/150
提交
取消