一
联合体的函数为union,联合体有对齐的特性。
它与结构体不同的点为联合体有对齐的特性。
如以下计算长度的结果
联合体为4
union on
{
char c;
int a;
};
结构体为8
struck on
{
char c;
int a;
};
联合体可以在首位置叠加,这样可以在特殊地方可以节省空间。
二
动态内存顾名思义可以动态的增加和减少内存,可以使初始开辟不必设置过大,造成浪费。
比如实现一个通讯录,如果想储存大量数据那么初始开辟的数组必然需要设置很大,那么如果使用的人需求很少只会储存几个联系人,那么其他开辟大量空间会造成浪费,如果有人有大量的使用需求超过了设置的最大数量,那么会造成储存失败。这时动态内存就发挥了很大作用。
局部变量储存的位置在栈区,不会开辟很大的空间。
动态内存分配在堆区,用多少开辟多少不会造成浪费。
动态内存有三个函数分别为
molloc(size_t size)生成单位字节的空间,需要主动初始化
calloc(size_t num, size_t size) 可以设置生成的大小和数量,并可以初始成为0
ralloc(void* ptr, size_t size) 添加空间,生成动态内存的主要函数
这三个函数都要配合free使用,free可以释放使用的堆区空间,在栈区申请的内存可以随着局部变量的结束自动释放 ,而堆区开辟的空间不会自动释放需要主动释放,free释放之后要把指向的空间置空。
常见的动态内存错误
1.对
NULL
指针的解引用操作
2.对动态开辟空间的越界访问
3.对非动态开辟内存使用
free
释放
4.使用
free释放一块动态开辟内存的一部分
5.对同一块动态内存多次释放
6.动态开辟内存忘记释放(内存泄漏)
三
柔性数组
在结构体类型末尾设置一个没有大小的数组就是柔性数组
typedef struct st_type
{
int i;
int a[];//柔性数组成员
}type_a;
柔性数组不参与结构体大小的计算
包含柔性数组成员的结构用
malloc ()
函数进行内存的动态分配,并且分配的内存应该大于结构的大
小,以适应柔性数组的预期大小。
相对于使用指针的优势是使用free释放一次就可以,而使用指针需要free两次,大大避免了忘记free的风险。