【C语言】动态内存管理,及柔性数组介绍!有浅到深!

 🔥博客主页🔥:【 坊钰_优快云博客 】

欢迎各位点赞👍评论✍收藏⭐

 

目录

 

1. 动态内存管理是什么

2. 为什么有动态内存分配

 3. 动态内存分配常用函数

3.1 malloc函数

 3.2 free函数

3.3 calloc函数

3.4 realloc函数

4. 动态内存常见错误

4.1 对空指针(NULL)的解引用

4.2 对开辟的空间造成越界访问

4.3 对非动态开辟内存使用free释放

4.4 free释放一块动态开辟内存的一部分

4.5 多次使用free释放(同一区域)

4.6 忘记释放(内存泄漏)

5. 柔性数组

5.1 柔性数组特点

 5.2 柔性数组使用

5.3 柔性数组好处

6. 小结


1. 动态内存管理是什么

首先动态内存管理的空间在堆区,是让程序员灵活控制内存的大小;

2. 为什么有动态内存分配

我们了解的开辟方式有:

int val = 20;//在栈空间上开辟四个字节 
char arr[10] = {0};//在栈空间上开辟10个字节的连续空间 

上述有两种特点

  1. 空间开辟大小是固定的
  2. 数组在申明的时候,必须指定数组的⻓度,数组空间⼀旦确定了大小不能调整

有时候我们需要的空间大小在程序运⾏的时候才能知 道,那数组的编译时开辟空间的方式就不能满⾜了 

引⼊了动态内存开辟,让程序员⾃⼰可以申请和释放空间,就⽐较灵活了

 3. 动态内存分配常用函数

3.1 malloc函数

void* malloc (size_t size);

 这个函数向内存申请⼀块连续可⽤的空间,并返回指向这块空间的指针

它的规则如下:

  1. 如果开辟成功,则返回⼀个指向开辟好空间的指针
  2. 如果开辟失败,则返回⼀个 NULL 指针,因此malloc的返回值⼀定要做检查
  3. 返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使⽤的时候使⽤者⾃⼰来决定
  4. 如果参数 size 为0,malloc的⾏为是标准是未定义的,取决于编译器

例:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    // malloc
    int* pf = (int*)malloc(40); // 40字节
    if (pf != NULL)     //一定要检查是否为空指针
    {
        for (int i = 0; i < 10; i++)   // 对于整型则为10个元素
        {
            *(pf + i) = i+1;
        }
    }
    else
    {
        perror("malloc");
    }
    free(pf);
    pf = NULL;
    return 0;
}

 3.2 free函数

void free (void* ptr);

函数free,专⻔是⽤来做动态内存的释放和回收的

free函数⽤来释放动态开辟的内存

  1. 如果参数 ptr 指向的空间不是动态开辟的,那free函数的⾏为是未定义的
  2. 如果参数 ptr 是NULL指针,则函数什么事都不做
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坊钰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值