详解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++实现迷宫小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • C++红黑树的底层实现机制详解

    C++红黑树的底层实现机制详解

    红黑树与AVL树一样,也是一种自平衡的二叉搜索树,它在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black,通过对任何一条从根到叶子的路径上各个结点着色方式的限制,本文介绍了C++红黑树的底层实现机制,需要的朋友可以参考下
    2024-08-08
  • C++实现LeetCode(145.二叉树的后序遍历)

    C++实现LeetCode(145.二叉树的后序遍历)

    这篇文章主要介绍了C++实现LeetCode(145.二叉树的后序遍历),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++连接并使用MySQL数据库

    C++连接并使用MySQL数据库

    这篇文章主要为大家详细介绍了C++连接并使用MySQL数据库,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • C++的函数与指针

    C++的函数与指针

    今天小编就为大家分享一篇关于C++函数与指针的文章,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2021-10-10
  • C++ 位运算的具体实现

    C++ 位运算的具体实现

    位运算直接对内存数据进行操作,不需要转换成十进制,因此处理速度非常快,本文主要介绍了C++ 位运算的具体实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • C++的最短路径的弗洛伊德算法案例讲解

    C++的最短路径的弗洛伊德算法案例讲解

    这篇文章主要介绍了C++的最短路径的弗洛伊德算法案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C++ OpenCV实战之手势识别

    C++ OpenCV实战之手势识别

    这篇文章主要介绍了如何利用C++ OpenCV实现手势识别,文中的示例代码讲解详细,对我们学习OpenCV有一定帮助,感兴趣的小伙伴可以了解一下
    2022-04-04
  • 从使用角度解读c++20 协程示例

    从使用角度解读c++20 协程示例

    类比线程,线程是个函数,把这个函数交给 创建线程的api,然后这个函数就变成线程了,这个函数本身没有任何特殊的地方,就是普通函数,这篇文章主要介绍了从使用角度解读c++20 协程示例,需要的朋友可以参考下
    2023-01-01
  • C++中的模板template小结

    C++中的模板template小结

    这篇文章主要介绍了C++中的模板template的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03

最新评论