码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 动态内存管理


    文章目录

    • 1、malloc
      • 1.1 malloc的用途
      • 1.2 malloc申请内存需要的参数
      • 1.3 malloc申请空间的时候会出现的问题
      • 1.4 malloc函数的使用
    • 2、free
      • 2.1 free的用法
    • 3、calloc
      • 3.1什么是calloc
      • 3.2 malloc和calloc之间的区别
    • 4、realloc
      • 4.1 什么是realloc
      • 4.2 realloc扩容时会出现的问题:


    1、malloc

    1.1 malloc的用途

    在这里插入图片描述

    传回来的是泛型指针,指向block内存的起始地址
    malloc申请的空间用途不明确,所以返回的是void*,拿到指针的时候强制类型转换即可

    1.2 malloc申请内存需要的参数

    在这里插入图片描述

    1.3 malloc申请空间的时候会出现的问题

    在这里插入图片描述

    如果内存开辟出现了问题,如内存不足,会返回一个空指针

    1.4 malloc函数的使用

    #include 
    #include //与malloc对应
    #include //与strerrno对应
    #include /
    int main()
    {
    	int arr[10] = { 0 };
    	int* p = (int*)malloc(40);
    	//未来如果我开辟40个字节的空间,同时需要以整型为单位一个一个去访问数据
    	//则通过int*这样的指针接收malloc返回的指针
    	//同时注意要把malloc返回的指针强制类型转换成int*
    	if (p == NULL)//同时要注意可能内存开辟失败
    	{
    		printf("%s\n", strerror(errno));//把错误码转换成对应的错误信息打印出来
    		return 1;
    	}
    	//代码走到这里就说明内存开辟成功
    	
    	//使用空间:给数组赋值
    	int i = 0;
    	for (i = 0; i < 10; i++)
    	{
    		*(p + i) = i;
    	}
    	for (i = 0; i < 10; i++)
    	{
    		printf("%d ", *(p + i));
    	}
    	//没有free
    	//并不是说内存空间就不回收了
    	//当程序退出的时候,系统会自动回收内存空间
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    内存粗略的可以划分为:栈区,堆区,静态区
    栈区用来存放局部变量,函数的形式参数
    堆区用来存放malloc,calloc,realloc,free所操作的空间


    2、free

    2.1 free的用法

    C语言提供了另外一个函数free,专门是用来做动态内存的释放和回收的,函数原型如下:

    在这里插入图片描述

    free函数用来释放动态开辟的内存。
    如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。
    如果参数 ptr 是NULL指针,则函数什么事都不做。
    在这里插入图片描述

    在free处设置断点观察p的值
    在这里插入图片描述

    free之前是1 2 3 4 5 6 7 8 9
    free以后:注意p的值没变,仍然是0x014794e0
    p会一直保存这个位置,为了规避野指针,最后将p置为NULL从而起到保护作用

    《垃圾收集》(Garbage Collection)扫描版[PDF]——part3
    rar 5星 超过95%的资源 16.96MB
    下载

    在这里插入图片描述


    3、calloc

    3.1什么是calloc

    C语言还提供了一个函数叫 calloc , calloc 函数也用来动态内存分配。原型如下:

    在这里插入图片描述

    在这里插入图片描述

    3.2 malloc和calloc之间的区别

    最大的区别就是:初始化:在函数返回之前将函数所指向的内存空间初始化为0

    在这里插入图片描述

    功能上可以近似的说:calloc = malloc + memset


    keil C 动态内存管理
    application/pdf 0星 超过10%的资源 142KB
    下载

    4、realloc

    4.1 什么是realloc

    realloc函数的出现让动态内存管理更加灵活。
    有时会我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的时候内存,我们一定会对内存的大小做灵活的调整。
    那 realloc 函数就可以做到对动态开辟内存大小的调整。 函数原型如下:

    在这里插入图片描述

    在这里插入图片描述

    4.2 realloc扩容时会出现的问题:

    在这里插入图片描述

    情况1:原有空间之后有足够大的空间
    情况2:原有空间之后没有足够大的空间

    实际情况是:如果内存足够,realloc直接在40个字节后面追加40个字节
    如果内存不够,realloc会找一个80个字节的空间,将原有的数据迁移到新空间,返回新空间的起始地址,同时释放掉旧空间

    int main()
    {
    	int* p = (int*)malloc(40);
    	if (NULL == p)
    	{
    		printf("%s\n", strerror(errno));
    		return 1;
    	}
    	//使用
    	//1 2 3 4 5 6 7 8 9 10
    	int i = 0;
    	for (i = 0; i < 10; i++)
    	{
    		*(p + i) = i + 1;
    	}
    	//扩容
    	int* ptr = (int*)realloc(p,80);
    	if (ptr != NULL)
    	{
    		p = ptr;
    	}
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在这里插入图片描述

  • 相关阅读:
    自己动手实现 HashMap(Python字典),彻底系统的学习哈希表(上篇)——不看血亏!!!
    算法练习11——买卖股票的最佳时机 II
    服务器命令
    【CSDN竞赛】第十期解题报告
    为什么我们要选择甲方型IT研发型IT-因为这是一个正确价值观问题
    cJson 学习笔记
    GIC/ITS代码分析(8)中断应用实例之SGI中断
    C语言--程序环境和预处理(宏)
    Elasticsearch
    内网穿透的应用-如何通过TortoiseSVN+内网穿透,实现公网提交文件到内网SVN服务器?
  • 原文地址:https://blog.csdn.net/qq_58029028/article/details/126082912
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号