C语言 | struct(结构体) 和 union(联合体)有什么区别

本文探讨了C语言中struct和union的主要区别,包括它们在内存布局和长度计算上的差异。通过实例展示了struct和union的字节对齐原理,并引出了改变union成员可能影响其他成员值的问题,揭示了C语言基本类型在内存中的存储方式。同时,提到了大小端问题对程序运行结果的影响,以及地址空间在物理和虚拟内存层面的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

区别

1.struct 的成员存放在不同地址上,union 所有成员存放在同一个地址空间。

2.struct 的长度是所有成员所占空间之和,union 的长度是其占用空间最大的成员的长度。

引出的几个问题

问题1:union 和 struct 的长度怎么算?
例如,下面应该输出多少?

struct Stu
{
	char sex;
	int age;
};
printf("sizeof(struct Stu) = %d\n", sizeof(struct Stu));

答案是8。这就涉及到了字节对齐的问题。

问题2:改变 union 的一个成员,是否会影响其他成员的值?

union U_A{
	char a;
	int b;
}u_c;
u_c.a = 0x01;
u_c.b = 0x0201;
printf("%d %d \n", u_c.b, u_c.a);

程序输出513 1 。可以看出,好像并没有影响(当然,这只是特例)。这就涉及到了C语言的基本类型在内存中究竟是怎么储存的问题。

问题3:什么,你的问题2中的程序运行结果和我的不一样?
这就涉及到了大小端的问题。

问题4:区别1中提到了地址空间,什么是地址空间?
这就涉及到了物理空间以及虚拟空间的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值