参考: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区别
- ubuntu下C/C++获取剩余内存 2023-09-18
- C++ 数据结构超详细讲解顺序表 2023-03-25
- C语言详解float类型在内存中的存储方式 2023-03-27
- 我应该为我的项目使用相对包含路径,还是将包含目录放在包含路径上? 2022-10-30
- 详解C语言中sizeof如何在自定义函数中正常工作 2023-04-09
- c++ const 成员函数,返回一个 const 指针.但是返回的指针是什么类型的 const? 2022-10-11
- Qt计时器使用方法详解 2023-05-30
- C语言qsort()函数的使用方法详解 2023-04-26
- C语言手把手带你掌握带头双向循环链表 2023-04-03
- Easyx实现扫雷游戏 2023-02-06
