C中的struct与union

版权声明:原创作品,允许转载。转载时请务必以超链接的形式标注原始文章、作者信息和本声明。否则追究法律责任http://blog.csdn.net/wo_hs


之前在学习C语言的时候,对于struct和union的认识就很不清晰,在学习了很多网友的讲解之后,也有了自己的认识。话不多说,下面开讲!

struct叫做结构体,union叫做联合体或者公用体。他们占用内存空间的大小与地址对其有关。对于下面这段代码:

struct S1{
	int a;
	double b;
	char c;
};

union U1{
	int a;
	double b;
	char c;
};

int main(){
	cout << "sizeof S1: " << sizeof(struct S1) << endl;
	cout << "sizeof U1: " << sizeof(union U1) << endl;
	return 0;
}

输出的结果是:

sizeof S1: 24
sizeof U1: 8

我们来分析一下出现这样结果的原因。

int占4字节,double占8字节,char占1字节。4+8+1=13。为什么S1是24字节呢?3*8=24!这是个巧合吗?明显不是。在struct中,所有的成员都会跟占空间最大的成员地址对齐(虽然他们自己的真正占用的内存空间没有改变)。

而union类型是所有成员公用相同的内存空间,所以Union的内存空间与最大成员所占的空间有关,所以U1的大小是8。同时union的空间还与成员中最大的地址对其有关。看下面这个例子:

union U1{
	char chs[13];
	char a;
};

union U2{
	char chs[13];
	int b;
};

int main(){
	cout << "sizeof U1: " << sizeof(union U1) << endl;

	cout << "sizeof U2: " << sizeof(union U2) << endl;
	return 0;
}

这个输出的结果是:

sizeof S1: 13
sizeof U1: 16

毫无疑问,char chs[13]是占13个字节的,a占一个字节,小于13,所以U1的大小是13,但是为什么U2时16呢?因为int的大小是4,要跟int地址对齐,结果必然是4的倍数,而16是大于13的最小的4的倍数。


讲到这里大家应该明白了吧?如果有不正确的地方欢迎批评指正!


参考链接:

http://www.cppblog.com/cc/archive/2006/03/20/4382.html

http://www.cnblogs.com/looksgood/archive/2009/10/29/1591949.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值