参考:Difference between Structure and Union in C二者区别struct这里不做详细说明,因为参考链接中都写明了。只做一些重点强调。struct中声明的变量,在分配空间的时候,struct结构空间大小,大于等于其内部所...

参考:Difference between Structure and Union in C
二者区别
struct
这里不做详细说明,因为参考链接中都写明了。只做一些重点强调。
struct中声明的变量,在分配空间的时候,struct结构空间大小,大于等于其内部所有变量大小的总和,一般会大于,因为需要字节对齐。
我们看一个例子
#include <stdio.h>
struct MyStruct
{
char c;
int a;
char x;
double b;
};
int main()
{
MyStruct s;
s.c = 'c';
s.a = 1000;
s.x = 'D';
s.b = 11.5;
return 0;
}
我们依次看看其赋值情况,就可以知道内存分布了。
执行s.c = 'c'
执行s.a = 1000
可以看到,中间跳过了3个字节,因为int
需要4字节对齐。
继续执行s.x = 'D'
s.b = 11.5
double需要8字节对齐,因此中间跳过了7个字节。
所以对于结构体来说,其内存分布是
所以结构体大小是24字节
验证一下,没什么问题。
对于结构体,没什么好说的,无非就是有相关需求,需要一个结构,有不同的数据类型。
值得说明的是,结构体可以嵌套,例如:
struct{
struct{
struct{
...
}
}
int x;
}
访问上来说,如果没名字,就直接访问,有名字就多几个.
,指的是这种命名
struct{
}name;
不过嵌套结构似乎很少用吧…
union
最大的区别就是,联合体中定义的不同数据类型,在分配空间的时候是重叠的,也就是说,它的大小应该以占用最大空间的内个为准,要等于它的大小。
#include <stdio.h>
union MyUnion
{
int a;
double b;
char c;
};
int main()
{
MyUnion b;
b.a = 10;
b.b = 1.0;
b.c = 'a';
return 0;
}
b
的大小是8,也就是最大的double
的大小。
我们依次运行看看:
b.a = 10
b.b = 1.0
b.c = 'a'
你会发现,都是在这8字节的空间内进行的!
但是注意覆盖问题。
对于同一块8字节的内存空间,覆盖的时候,只覆盖自己占的地方,例如,对于8字节空间,改变占1字节的
char
的时候,只覆盖第一个字节,剩下的7字节保持不变。
最后,它也同样可以嵌套。
至于访问的时候的变化,只需要明确,访问的都是对应大小的内存单元。
因此,不管谁改,都是该内存,至于值
- 如果访问的是double,就是把这8个字节转换为double
- 如果访问的是int,就把前4个字节转换为int
- char同理。
本文标题为:C语言中的struct和union区别


基础教程推荐
- C/C++编程中const的使用详解 2023-03-26
- C++详细实现完整图书管理功能 2023-04-04
- C语言基础全局变量与局部变量教程详解 2022-12-31
- 如何C++使用模板特化功能 2023-03-05
- C++使用easyX库实现三星环绕效果流程详解 2023-06-26
- 详解c# Emit技术 2023-03-25
- C++中的atoi 函数简介 2023-01-05
- 一文带你了解C++中的字符替换方法 2023-07-20
- C语言 structural body结构体详解用法 2022-12-06
- C利用语言实现数据结构之队列 2022-11-22