联合体、动态内存、柔性数组学习复盘2022-4-10

联合体的函数为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的风险。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值