了解动态内存管理函数melloccallocfreerealloc,实现内存管理自由!(代码片段)

凛音Rinne 凛音Rinne     2023-01-10     207

关键词:

动态内存管理

笔记自取链接:动态内存管理笔记



导言

众所周知~,内存的分配如下图所示:

我们已经不满足于

int a = 0;
int b[3] = 0;

这种变量占有固定的字节数,修改不了

我们比较熟悉的是静态区和栈区的变量类型,那么堆区里面有什么?

接下来让我们一起了解一下动态内存分配类型的函数


一、mallco 开辟动态内存空间

需包含头文件:stdlib.h

返回值和参数

void* malloc (size_t size);

解读:在堆区上申请size大小的空间,返回堆区上这个空间的起始地址

如何使用:

int* p = (int *)malloc(4);//我们专门申请一块空间放整型

如果直接解引用

int* p = (int *)malloc(4);
*p = 1;//有风险

malloc开辟失败会返回一个空指针

我们需要判断是否申请内存成功

if(p == NULL)

    return -1;//分配失败

else

    *p = 3;//使用该空间   


二、free 释放动态内存空间

需包含头文件:stdlib.h

我们用完mellco函数申请的空间时,这块空间不想要

用free函数释放空间


free函数的返回值和参数

void free (void* ptr);

解读:给free函数传一个指针(必须是动态空间的起始地址),指针所指向的空间释放掉,如果传NULL,什么都不执行


!!!!!!!!!!!!!!!但是!!!!!!!!!!!!!!!!

我们运行的时候 p的地址如下


当我们释放内存空间时

虽然空间释放掉了,p指针所指向的地址还是刚才的地方,p仍然可以访问,这样子就很危险,因为p现在是一个野指针

free(p);
p = NULL;

把它变成空指针,这样就安全了


三、calloc 初始化+开辟动态内存空间

需包含头文件:stdlib.h

返回值和参数

void* calloc (size_t num, size_t size);

解读:在堆区上申请num个size大小的空间返回堆区上这个空间的起始地址,并且把所有元素初始化成0

如何使用

int* p = (int*)calloc(10, 4);//40字节

其他功能和melloc类似

  • 开辟失败返回NULL,成功返回空间的起始地址
  • 使用的时候判断是否失败
  • 使用结束的时候需要用free释放该内存空间

唯一区别就是melloc不会初始化


四、realloc 调整动态内存空间大小

一段时间后,我们可能会觉得,之前申请的空间太小或者过大了,为了合理且灵活使用内存时,我们可以用realloc对动态内存空间进行大小的修改

返回值和参数

void* realloc (void* ptr, size_t size);

解读:

  • ptr 是要调整的内存地址

  • size是调整之后新大小

  • 返回值为调整之后的内存起始位置

  • 这个函数调整原内存空间大小的基础上,还**可能会将原来内存中的数据移动到新的空间**

    realloc在调整内存空间两种情况:

    1. 原有空间之后有足够大的空间:直接原有内存之后直接追加空间,原来空间的数据不发生变化

    1. 原有空间之后没有足够多的空间:在堆空间上新找一个大小合适的连续空间来存放,realloc函数返回的是一个新的内存地址

但在使用过程中需要注意

int* p = (int*)malloc(10);
//我想要20个字节
int* p = (int*)realloc(p, 20);
//这样子写真的可以吗

如果遇到调整动态空间错误,realloc会返回空指针,这样我们原本的空间也丢失了

我们需要一个临时变量接受指针

int* ptr = (int*)realloc(p, 20);

if(ptr != NULL)

    p = ptr;//调整成功

else

    return -1;


free(p);
p = NULL;

小结

虽然动态内存空间使用很灵活,但我们还是需要注意以下常见的错误

  • 对NULL(空)指针的解引用操作

    注意,在申请内存空间时,可能失败,导致返回空指针

  • 对动态开辟空间的越界访问

    使用该空间时候,所申请超出空间的范围

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

    free只能释放动态内存!!!

  • 使用free释放一块动态开辟内存的一部分

    传递给free去释放的指针必须是所开辟动态空间的起始地址

    开辟动态空间的起始地址不能随便++或–等操作改变地址

    除非创建临时参数使用

  • 对同一块动态内存多次释放

    free(p);
    free(p);
    

    错误,不能连续释放


    正确写法:

    free(p);
    p = NULL;
    free(p);
    p = NULL;
    
  • 动态开辟内存忘记释放(内存泄漏)

    内存释放两种方式:

    • free函数释放
    • 程序运行结束自动释放

    如果一个程序(比如服务器)一直运行,而你不释放这块内存,内存空间就一直被占用,浪费


[c++]一篇带你了解c++中动态内存管理

...动态开辟内存的方法。1、C/C++程序的内存开辟首先我们先了解一下C/C++程序内存分配的几个区域:intglobalVar=1;staticintstaticGlobalVar=1;voidTest()staticintstaticVar=1;intlocalVar=1;intnum1[10]=1, 查看详情

动态内存管理详解(动态内存函数介绍+常见动态内存错误+经典笔试题)(代码片段)

文章目录为什么存在动态内存分配内存分配知识拓展动态内存函数malloc和free函数calloc函数realloc函数常见的动态内存错误1.对NULL指针的解引用操作2.对动态开辟空间的越界访问3.对非动态开辟内存使用free释放4.使用free释放一块动... 查看详情

c/c++内存管理(代码片段)

...ff09;        operatornew与operatordelete的类专属重载(了解)5、new和delete的实现原理        内置类型        自定义类型6、定位new表达式(placement-new)(了解)7、常见面试题        7.1、malloc/free和new/del... 查看详情

c语言进阶动态内存管理(代码片段)

目录为什么存在动态内存分配动态内存函数介绍1.malloc函数2.Calloc函数3.realloc函数常见的动态内存错误1.对NULL指针的解引用操作2.对动态开辟空间的越界访问3.使用free释放分动态内存开辟的空间4.使用free释放动态内存中的一部分5.... 查看详情

动态内存管理(下)(代码片段)

目录:上篇:(3条消息)动态内存管理(上)_执久呀的博客-CSDN博客      动态函数的介绍:malloc free calloc realloc     三、 calloc函数     calloc函数介绍:     calloc的使用例子:四、 realloc函... 查看详情

一篇文章玩转c语言动态内存,轻松管理动态内存空间(代码片段)

C语言动态内存管理1、动态内存分配存在的原因2、动态内存函数的介绍2.1malloc函数2.2free函数2.3calloc函数2.4realloc函数3、常见的动态内存错误3.1对NULL空指针的解引用操作3.2对动态开辟空间的越界访问3.3对动态开辟空间的越界访问3.... 查看详情

c语言☀️动态内存管理及相关函数(代码片段)

目录一、为什么存在动态内存分配二、动态内存函数 malloc和freecallocrealloc一、为什么存在动态内存分配 之前我们学过的开辟空间的方式就是如下两种:intmain() inta=5; charch='b'; intarr[20]=0;以上的开辟内存的方式... 查看详情

动态内存管理(代码片段)

文章目录为什么存在动态内存分配动态内存函数的介绍mallocfreecallocrealloc常见的动态内存错误对NULL指针的解引用对开辟空间的越界访问对非动态开辟内存进行free使用使用free函数释放内存的一部分对同一块内存进行多次释放对动... 查看详情

动态内存函数+经典笔试题@动态内存管理---malloc+free+calloc+realloc(代码片段)

本文重点1.动态内存函数的介绍1.1malloc和free1.1.1malloc1.1.2搭配使用的free1.2calloc1.3realloc2.常见动态内存错误2.1对动态开辟的空间越界访问2.2对NULL指针解引用2.3对非动态开辟的内存用free释放2.4使用free释放动态开辟内存的一部分2.5对... 查看详情

⭐️欢度国庆-共约c语言进阶⭐️动态内存管理+柔性数组建议收藏(代码片段)

目录前言为什么存在动态内存分配动态内存函数的介绍malloc和free函数malloc函数:free函数calloc函数realloc函数常见的动态内存错误几个经典的笔试题C/C++程序的内存开辟柔性数组柔性数组的特点柔性数组的使用和优势前言... 查看详情

动态内存管理函数(代码片段)

一、为什么使用动态内存分配?目前掌握的内存开辟方式为:intval=20;//在栈上开辟4个字节的空间。intarr[20]=0;//在栈上开辟40个字节的连续空间。上述开辟空间的方式由两个特点:开辟的空间大小事固定的数... 查看详情

c内存管理初步了解

1首先变量了解几个概念  静态变量:用static修饰的变量  局部变量:存储在栈区;作用域是函数块内;生存期是直到函数块结束  全局变量:存储在静态区;作用域是从定义到本源程序结束,生存期是运行期间  静态... 查看详情

c语言篇(动态内存管理)(代码片段)

...9;编程环境:vs2013提示:本文内容主要讲述堆中的动态内存开辟的问题!!!文章目录准备前言一、为什么存在动态内存二、动态内存函数的介绍1.malloc函数和free2.calloc函数3.realloc函数三.经典例题3.1传值还是传... 查看详情

动态内存管理(动态内存函数的介绍,c/c++经典笔试题,柔性数组)(代码片段)

...🎆👀😄❤️👍💪🎓为什么存在动态内存分配🎓动态内存函数的介绍✏️malloc和free✏️calloc✏️realloc🎓常见的动态内存错误🎓几个经典的笔试题🎓C/C++程序的内存开辟&#x 查看详情

❤️c语言动态内存管理库函数介绍❤️(代码片段)

⭐️前面的话⭐️大家好!在实现动态通讯录的时候,我用到了malloc和realloc动态申请内存,所以今天我想来和大家分享有关动态内存管理函数与柔性数组的相关知识。👋Hi~o( ̄▽ ̄)ブ这里是猪猪程序员... 查看详情

c++——动态内存管理详解(代码片段)

...间通信。(Linux课程如果没学到这块,现在只需要了解一下)堆用于程序运行时动态内存分配,堆是可以上增长的。数据段–存储全局数据和静态数据。代码段–可执行的代码/只读常量。C++动态内存管理C语... 查看详情

c++——动态内存管理详解(代码片段)

...间通信。(Linux课程如果没学到这块,现在只需要了解一下)堆用于程序运行时动态内存分配,堆是可以上增长的。数据段–存储全局数据和静态数据。代码段–可执行的代码/只读常量。C++动态内存管理C语... 查看详情

动态内存管理(代码片段)

动态内存管理前言一、动态内存函数的介绍二、常见动态内存错误1.对NULL指针的解引用操作2.对动态开辟空间的越界访问3.对非动态开辟内存使用free释放4.使用free释放一块动态开辟内存的一部分5.对同一块动态内存多次释放6.动态... 查看详情