详解C语言之动态内存管理

 更新时间:2021年11月09日 15:25:40   作者:iEucliwood  
本文主要介绍了C语言动态内存管理的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

先来了解一下动态管理内存所需用到的函数

开辟动态内存的函数

1.malloc函数void* malloc(size_t size);

功能:开辟一块大小为size单位为字节的动态空间。若开辟成功返回函数开辟空间的无类型指针,若开辟失败则返回空指针NULL

2.calloc函数 void* calloc(size_t num, size_t size);

功能:开辟一块能容纳下num个元素,每个元素大小为size字节的动态空间,且将每个元素的值初始化为0。若开辟成功返回函数开辟空间的无类型指针,若开辟失败则返回空指针NULL

3.realloc函数void* realloc(void* ptr, size_t size);

功能:将指针ptr所指的动态内存空间大小调整为size个字节。调整完成后返回原指针或新位置的指针又或是空指针

释放开辟的动态内存空间的函数

free函数void free(void* ptr);

功能:释放由malloc、calloc或realloc开辟的动态内存空间,不改变ptr的值。当参数为空指针时不进行操作。

错误信息函数

strerror函数char* strerror(int errnum);

功能:返回错误码errnum对应的错误信息字符串的指针。

注:错误码为errno

具体使用例: 

malloc函数和calloc函数的区别就是前者开辟空间后不初始化直接返回地址,后者开辟空间后将数值都初始化为0后在返回地址,这里用malloc函数作示例

需要注意的是在使用了空间并释放了空间后,p仍指向那块释放了的空间,此时需要将p指向空指针

接下来是realloc函数,realloc函数在调整大小时会遇到三种情况,假设用malloc函数开辟4个字节的空间,橙色代表malloc开辟的空间,淡蓝色表示已被占用的空间。

 第一种情况:开辟的空间加上后面剩余的空间 能够 容纳下调整后的空间大小,则直接在原空间后追加空间。此情况函数返回原地址,假设需要调整到六个字节,空间布局如下

 

 第二种情况:开辟的空间加上后面剩余的空间 不能够 容纳下调整后的空间大小,则重新开辟一块新的空间,并将原数据拷贝过来。然后释放掉之前的空间。此情况函数返回新位置的地址,假设调整到9个字节,空间布局如下

第三种情况: 也是malloc和calloc函数都存在的情况,堆区中没有足够的空间来开辟。此情况函数返回空指针

 realloc函数示例

 要注意,realloc函数使用时对于返回值一定要进行判断,因为返回值有可能为空指针,不要直接就赋给p否则有可能函数返回了空指针,p本来存着原地址的,然后一赋值就找不到原地址了

常见的动态内存错误

1.对NULL指针的解引用操作

2.对动态开辟内存的越界访问

3.使用free释放非动态开辟内存

4.使用free释放动态开辟内存的一部分

5.对同一块动态内存的多次释放

6.动态内存开辟忘记释放(内存泄漏)

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • C语言实现带头双向循环链表

    C语言实现带头双向循环链表

    本文主要介绍了C语言实现带头双向循环链表,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 字符串的模式匹配详解--BF算法与KMP算法

    字符串的模式匹配详解--BF算法与KMP算法

    这篇文章记录一下串里面的模式匹配,模式匹配,顾名思义就是给定一个被匹配的字符串,然后用一个字符串模式(模型)去匹配上面说的字符串,看后者是否在前者里面出现。常用的有2种算法可以实现,下面我们来具体探讨下
    2014-08-08
  • 深入理解C/C++混合编程

    深入理解C/C++混合编程

    本篇文章是对C/C++混合编程进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • c++基础语法:构造函数初始化列表

    c++基础语法:构造函数初始化列表

    构造函数需要初始化的数据成员,不论是否显示的出现在构造函数的成员初始化列表中,都会在该处完成初始化,并且初始化的顺序和其在声明时的顺序是一致的,与列表的先后顺序无关
    2013-09-09
  • C语言循环链表的原理与使用操作

    C语言循环链表的原理与使用操作

    无论是静态链表还是动态链表,有时在解决具体问题时,需要我们对其结构进行稍微地调整。比如,可以把链表的两头连接,使其成为了一个环状链表,通常称为循环链表
    2022-05-05
  • C语言植物大战数据结构快速排序图文示例

    C语言植物大战数据结构快速排序图文示例

    这篇文章主要为大家介绍了C语言植物大战数据结构快速排序图文示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • C++标准模板库string类的介绍与使用讲解

    C++标准模板库string类的介绍与使用讲解

    今天小编就为大家分享一篇关于C++标准模板库string类的介绍与使用讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • QT使用QChart绘制面积图

    QT使用QChart绘制面积图

    在Qt中使用QChart类可以快速绘制一个图表出来,比如折线图、饼图、柱状图等,本文就来为大家介绍一下如何利用QChart绘制简单的面积图吧
    2024-11-11
  • C++实现第K顺序统计量的求解方法

    C++实现第K顺序统计量的求解方法

    这篇文章主要介绍了C++实现第K顺序统计量的求解方法,很有借鉴价值的算法,需要的朋友可以参考下
    2014-08-08
  • C++自定义函数判断某年某月某日是这一年中第几天

    C++自定义函数判断某年某月某日是这一年中第几天

    这篇文章主要介绍了C++自定义函数判断某年某月某日是这一年中第几天的方法,涉及C++日期与时间操作相关技巧,需要的朋友可以参考下
    2016-06-06

最新评论