• C语言动态内存管理


    1.为什么要动态内存分配?

    1. int val = 20;
    2. int a[10]={0};

    上面我们声明并定义了一个大小为4字节的整型变量,一个容量为10*4字节的整型数组。

    开辟方式:我们在栈上开辟。


    开辟空间的方式有两个特点:
    1. 空间开辟 大小是固定 的。
    2. 数组在申明的时候, 必须指定数组的长度,它所需要的内存在编译时分配
    但是对于空间的需求,不仅仅是上述的情况。有时候我们需要的空间大小在程序运行的时候才能知道, 那数组的编译时开辟空间的方式就不能满足了。
    有的老铁会说,数组的话,怎么会不够?一开始指定数组长度就为100,甚至更大不就行了。确实,能想到这样,说明你的思维方式没问题,当你的父母让你煮饭,但是你的父母并没有告诉你具体煮多少时,最好的办法就是每个人再多加一碗。这就是扩大范围,减少容错率。但是,明明每个人一碗饭就够了,你多煮一碗就会浪费(不能这餐吃完)。
    动态分配诞生!

    2. 动态内存函数

    2.1 mallocfree

    C 语言提供了一个动态内存开辟的函数:
    void* malloc (size_t size);
    2.2C 语言提供了另外一个函数 free ,专门是用来做动态内存的释放和回收的
    void free (void* ptr);
    free 函数用来释放动态开辟的内存。
    如果参数 ptr 指向的空间不是动态开辟的,那 free 函数的行为是未定义的。
    如果参数 ptr NULL 指针,则函数什么事都不做。

    3.malloc和free

    1. #include
    2. #include
    3. int main()
    4. {
    5. int a[10] = {0};
    6. int* ptr = (int*)malloc( 10* sizeof(int));
    7. if (NULL != ptr)//判断ptr指针是否为空
    8. {
    9. int i = 0;
    10. for (i = 0; i < 10; i++)
    11. {
    12. *(ptr + i) = i;
    13. printf("%3d",i);
    14. }
    15. }
    16. free(ptr);//释放ptr所指向的动态内存
    17. ptr = NULL;
    18. return 0;
    19. }

    mallocfree都声明在 stdlib.h 头文件中。 使用要包含头文件。上面我们让一个指针ptr指向了开辟了10个整型大小空间。并赋值。然后释放。

    我们可以按F11开始调试,具体可以看看作者这篇文章

    最后运行完free,空间就会释放出来。

    如果没有free函数,当程序结束后同样空间也会释放,但是,就像你借书一样,你又不看,别人想用又用不了,这样的事其实就很没意义了。好习惯是有借有还。我们在释放完空间后,应该把指针置空,防止要使用这个指针时这个指针还是指向这块分配的区域,导致出错。


    4.calloc函数

    C语言还提供了一个函数叫 calloc calloc 函数也用来动态内存分配。

    void* calloc (size_t num, size_t size);

    它与malloc功能一样。但是它在使用的时候会初始化数据为0。

    (int*)calloc(10,sizeof(int))=(int*)malloc(10*sizeof(int))+初始化数据为0


    5.realloc函数
    void* realloc (void* ptr, size_t size);
    realloc 函数的出现让动态内存管理更加灵活。
    有时会我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的时
    候内存,我们一定会对内存的大小做灵活的调整。那 realloc 函数就可以做到对动态开辟内存大小
    的调整。

    ptr 是要调整的内存地址
    size 调整之后新大小
    返回值为调整之后的内存起始位置。
    这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到 的空间。
    realloc 在调整内存空间的是存在两种情况:
    情况 1 :原有空间之后有足够大的空间
    情况 2 :原有空间之后没有足够大的空间

    情况 1
    当是情况 1 的时候,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化。
    情况 2
    当是情况 2 的时候,原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小
    的连续空间来使用。这样函数返回的是一个新的内存地址
    由于上述的两种情况, realloc 函数的使用就要注意一些。
  • 相关阅读:
    Filebeat自定义index和fields
    Python复现nature气象插图
    消息队列MQ详解(Kafka、RabbitMQ、RocketMQ、ActiveMQ等)
    【Linux】 - Linux中的重定向和管道符
    十、ThreadLocal
    Java线程stop,sleep,yield,join
    Go中rune类型浅析
    365天深度学习训练营-第3周:天气识别
    江西服装学院图书馆藏《乡村振兴战略下传统村落文化旅游设计》许少辉八一新著
    ESP8266使用记录(三)
  • 原文地址:https://blog.csdn.net/qq_62381986/article/details/133947015