码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【C语言】malloc()函数详解(动态内存开辟函数)


     🦄个人主页:修修修也

    🎏所属专栏:C语言

    ⚙️操作环境:Visual Studio 2022


    目录

    一.malloc()函数简介

    1.函数功能

    2.函数参数

    📌size_t size

    3.函数返回值

    4.函数头文件

    5.函数生成空间(与calloc区别)

    二.malloc()函数的具体使用

    1.使用malloc()函数完成动态整型数组空间的开辟

    2.使用malloc()函数完成动态结构体空间的开辟

    结语


    一.malloc()函数简介

    我们先来看一下cplusplus.com - The C++ Resources Network网站上malloc()函数的基本信息:

    1.函数功能

    可以看到,malloc()函数的功能是:向内存申请一块连续可用的空间,并返回指向块开头的指针.


    2.函数参数

    该函数有1个参数,是:

    void* malloc (size_t size);

    📌size_t size

    该参数的类型是size_t(无符号整型),它表示要开辟的内存块的大小(以字节为单位),它的作用是告诉函数需要动态开辟多少个字节的空间.

    在使用malloc时,一般参数传递的形式为(sizeof(要开辟的变量名)*要开辟的个数).

    当然也可以直接给malloc传一个具体的数字作为参数,比如:malloc(40);这样malloc()函数就会开辟一个大小为40字节的空间给你使用.


    3.函数返回值

    函数的返回值类型是void*(无类型指针),它的作用是在函数运行结束后返回给主函数动态开辟好的空间块的首地址,以便后续进行对这块内存空间的使用.

    但要注意:如果在malloc()函数在开辟的过程中遇到了无法分配请求的内存块(即遇到了开辟失败的情况),那么就会返回一个NULL指针,因此malloc的返回值一定要进行检查!


    4.函数头文件

    该函数包含在头文件中.


    5.函数生成空间(与calloc区别)

    malloc()函数生成的空间内容是不会初始化的!

    我们可以调试一下,打开监视窗口查看malloc()函数开辟的内存空间存放的内容:

    不会调试使用监控查看程序运行状况的可以移步:

    【实用调试技巧】总是找不到Bug?手把手教你在vs2022中调试程序icon-default.png?t=N7T8https://blog.csdn.net/weixin_72357342/article/details/133823086?spm=1001.2014.3001.5502

    可以看到,malloc()函数开辟的内存空间中存放的值是随机值,我们后续需要初始化后再进行使用.

    而与之相对的另一个动态开辟函数calloc则会开辟一段已经全部初始化为0的空间:

    想要了解更多关于calloc()函数的内容可以移步:

    【C语言】calloc()函数详解(动态内存开辟函数)icon-default.png?t=N7T8https://blog.csdn.net/weixin_72357342/article/details/133975677我们在这篇就不多赘述了,只简述他们俩在开辟空间方面的区别.


    二.malloc()函数的具体使用

    malloc()函数的使用场景是:当我们想要使用一块连续的可以按需求调节大小的空间时,我们可以使用malloc()函数来实现这一诉求.

    需要特别注意的是!使用malloc()函数动态开辟的内存空间是必须使用free()函数释放还给操作系统的,如果不释放的话就会造成内存泄漏!

    内存泄漏:如果动态开辟的内存没有被释放,那么这些内存就会一直占用系统资源,从而导致内存泄漏。内存泄漏会导致程序运行速度变慢,甚至崩溃。

    对free()函数还不太了解的可以移步这里:

    【C语言】free()函数详解(动态内存释放函数)icon-default.png?t=N7T8https://blog.csdn.net/weixin_72357342/article/details/133975657

    1.使用malloc()函数完成动态整型数组空间的开辟

    如下,我们使用malloc()函数开辟一个有10个元素的整型数组:

    我们给malloc()函数传入:sizeof(int)*10(即10个整型大小的字节数,即40byte).

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. #include
    4. #include
    5. #include
    6. int main()
    7. {
    8. int* p = (int*)malloc(sizeof(int) * 10); //动态开辟内存空间
    9. if (p != NULL) //检验动态开辟空间是否成功
    10. {
    11. int i = 0;
    12. for (i = 0; i < 10; i++) //如果成功,则给这10个整型赋值
    13. {
    14. *(p + i) = i;
    15. printf("%d\n", *(p + i));
    16. }
    17. }
    18. else
    19. {
    20. printf("%s\n", strerror(errno)); //如果失败,则打印失败错误信息
    21. return 0; //失败则不需要进行下面的释放和置空操作了,可以直接退出
    22. }
    23. free(p); //使用完后向系统归还动态开辟的内存空间
    24. p = NULL; //将p指针置为空,避免p成为野指针
    25. return 0;
    26. }

    在vs编译器中运行查看结果:

    可见malloc()函数成功的开辟出了40个字节的空间来存放这10个整型数据元素.

    而如果我们将动态内存开辟的空间大小改为INT_MAX(即2147483647),动态内存开辟就会失败,并告诉我们原因:

    这里还有需要注意的点是,用malloc()函数申请0个空间是一种未定义的行为,不同的编译器会有不同的解决方法,但这样的操作的没有实际意义的.


    2.使用malloc()函数完成动态结构体空间的开辟

    创建好结构体变量后,我们给malloc()函数传入:sizeof(PeoInfo)*3(即3个PeoInfo类型大小的字节数).

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. #include
    4. #include
    5. #include
    6. //人的信息-结构体
    7. typedef struct PeoInfo
    8. {
    9. char name[20];
    10. int age;
    11. char sex[5];
    12. char addr[20];
    13. char tele[11];//电话11位,留一位给'\0';
    14. }PeoInfo;
    15. typedef struct Contact
    16. {
    17. PeoInfo* data; //存放人的信息
    18. int sz; //用来记录当前已经存放的信息的个数
    19. int capacity; //记录当前通讯录的最大容量
    20. }Contact;
    21. int main()
    22. {
    23. Contact con;
    24. PeoInfo* ptr = (PeoInfo*)malloc(sizeof(PeoInfo)*3); //动态开辟空间
    25. if (ptr == NULL) //如果开辟失败,则打印错误原因
    26. {
    27. perror("InitContact::malloc");
    28. return;
    29. }
    30. free(ptr); //使用完后向系统归还动态开辟的内存空间
    31. ptr = NULL; //将p指针置为空,避免p成为野指针
    32. return 0;
    33. }

    在vs编译器中查看结果:

    可见malloc()函数成功的开辟出了3个PeoInfo类型的空间来存放这3个元素.


    结语

    希望这篇malloc()函数详解能对大家有所帮助,欢迎大佬们留言或私信与我交流.

    有关更多动态开辟相关知识可以移步:

    【C语言】内存的动态分配与释放icon-default.png?t=N7T8https://blog.csdn.net/weixin_72357342/article/details/134099965?spm=1001.2014.3001.5502

    学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!

    相关文章推荐

    【C语言】malloc()函数详解(动态内存开辟函数)

    【C语言】realloc()函数详解(动态内存开辟函数)

    【C语言】calloc()函数详解(动态内存开辟函数)

    【C语言】free()函数详解(动态内存释放函数)

    【C语言】memcpy()函数

    【数据结构实战项目】C语言实现数据结构顺序表万字详解(附完整运行代码)

    【实用编程技巧】不想改bug?初学者必须学会使用的报错函数assert!(断言函数详解)


     


    C语言动态内存开辟相关库函数思维导图:

  • 相关阅读:
    结构体入门到进阶
    考研政治---马克思主义基本原理概论---认识论
    ICA、TJA、ACC、ICC
    条件表达式
    什么是图数据库,解释图数据库的特点和应用场景
    管程的介绍
    零基础也能快速上手活动海报设计
    【量化交易笔记】11.移动平均交易策略
    Docker搭建RK3568开发环境
    JUC的线程池架构
  • 原文地址:https://blog.csdn.net/weixin_72357342/article/details/133971625
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | 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号