c语言中 占不占字节,C语言结构体占字节数问题

这叫做 padding 。

先说一下,char s[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 {char a; int b;}; ,a 后很有可能会被 pad 3 个字节,最后结构体大小为 8 字节。

最后,padding 是与编译器、操作系统、体系结构有关的。同一段程序在不同的地方可能会有不同的 padding 结果(从而有不同的大小)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值