【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.函数头文件

该函数包含在头文件<stdlib.h>中.


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).

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>int main()
{int* p = (int*)malloc(sizeof(int) * 10);   //动态开辟内存空间if (p != NULL)                          //检验动态开辟空间是否成功{int i = 0;for (i = 0; i < 10; i++)            //如果成功,则给这10个整型赋值{*(p + i) = i;printf("%d\n", *(p + i));}}else{printf("%s\n", strerror(errno));   //如果失败,则打印失败错误信息return 0;                          //失败则不需要进行下面的释放和置空操作了,可以直接退出}free(p);         //使用完后向系统归还动态开辟的内存空间p = NULL;              //将p指针置为空,避免p成为野指针return 0;
}

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

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

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

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


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

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

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>//人的信息-结构体
typedef struct PeoInfo
{char name[20];int age;char sex[5];char addr[20];char tele[11];//电话11位,留一位给'\0';
}PeoInfo;typedef struct Contact
{PeoInfo* data;  //存放人的信息int sz;         //用来记录当前已经存放的信息的个数int capacity;   //记录当前通讯录的最大容量
}Contact;int main()
{Contact con;PeoInfo* ptr = (PeoInfo*)malloc(sizeof(PeoInfo)*3);   //动态开辟空间if (ptr == NULL)            //如果开辟失败,则打印错误原因{perror("InitContact::malloc");return;}free(ptr);         //使用完后向系统归还动态开辟的内存空间ptr = NULL;              //将p指针置为空,避免p成为野指针return 0;
}

在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语言动态内存开辟相关库函数思维导图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/52918.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STL值list

list容器 头文件&#xff1a;#include<list> - list是一个双向链表容器&#xff0c;可高效地进行插入删除元素 - list不可以随机存取元素&#xff0c;所以不支持at.(pos)函数与[]操作符 注&#xff1a;list使用迭代器访问数据时可以一步一步走自增自减&#xff08;即…

计算机操作系统之并行性与并发性笔记

目录 在计算机操作系统中&#xff0c;并行性与并发性是两个既相似又有区别的重要概念 并行性&#xff1a; 并发性&#xff1a; 可以通过多任务处理和资源共享来具体说明 并发性的例子 并行性的例子 总结 在计算机操作系统中&#xff0c;并行性与并发性是两个既相似又有区别…

gitlab无法push(pre-receive hook declined)

如果是个人的项目&#xff0c;托管在官网&#xff0c;可以参考这位大佬的&#xff0c; GitLab新建项目后push reject提交失败的解决办法_push rejected-CSDN博客 如果是公司的项目&#xff0c;去项目成员里看自己的身份&#xff0c;如果只是developer&#xff0c;是无法push到…

分享一个基于微信小程序的居家养老服务小程序 养老服务预约安卓app uniapp(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

【苍穹外卖】总结

1 pom 依赖 1.1 MyBatis Spring 用于简化 MyBatis 与 Spring Boot 的集成&#xff0c;提供了对 MyBatis 框架的自动配置支持&#xff0c;简化了数据访问层的开发 1.2 Lombok Lombok 是一个 Java 库&#xff0c;能够通过注解自动生成常见的代码&#xff08;如 getter、setter、…

AI教你学Python :详解Python运算符(补充)

详解Python运算符&#xff08;补充&#xff09; 在Python编程中&#xff0c;运算符用于执行特定的操作&#xff0c;比如数学计算、逻辑判断、位操作等。了解和灵活运用各种运算符能帮助我们提高编程效率和代码的可读性。 1. 运算符的分类 运算符主要可以分为以下几类&#x…

flink实战--如何基于java-agent技术增强Flink功能

Agent实现Flink流动数据的监听 一个Flink程序的运行,会依赖到一个或多个Connector(连接器),而这些连接器分为Source(主要用于读)和Sink(主要用于写),那么如果要监听到Flink作业流动的数据,我们这里可以简单尝试去查看支持Sink的Connector(例如:flink…

看Threejs好玩示例,学习创新与技术(三)

本文接上篇内容&#xff0c;继续挖掘应用ThreeJS的一些创新算法。 1、获得鼠标移动对应的地理位置 这个算法如果放在几年前&#xff0c;那肯定会难倒一帮人的。因为是三维投影涉及矩阵变换及求逆&#xff0c;而且还是投影模式下的。在Project Texture这个示例中&#xff0c;作…

Ubuntu下Git使用教程:从入门到实践

引言 在软件开发和版本控制领域&#xff0c;Git无疑是最为流行的工具之一。它不仅能够帮助我们高效地管理代码&#xff0c;还能促进团队协作&#xff0c;确保项目的持续集成与交付。对于使用Ubuntu操作系统的开发者而言&#xff0c;掌握Git的使用技巧尤为重要。本文将带您一步…

Apache-wed服务器环境的安装

一。安装httpd并且开启httpd yum install httpd systemctl start httpd 二。关闭防火墙 systemctl stop firewall 三。常规配置wed服务 mkdir /www vim index.html&#xff08;里面写入自己的内容&#xff09; chmod 755 index.htm chmod 755 /www vim /etc/httpd/co…

从冯唐的成事心法 看SAP协助企业战略落地到信息化

冯唐的《成事心法》是一部结合古代智慧和现代管理理念的著作&#xff0c;通过分析和解读古代名臣张居正的管理方法&#xff0c;提出了一套实用的成事之道。这本书的结构循序渐进&#xff0c;讲解了如何在工作和生活中实现目标、解决问题。以下是《成事心法》的主要结构和内容概…

【Node.js】初识微服务

概述 Node.js 的微服务架构是一种通过将应用程序分解为独立的、松耦合的小服务的方式进行系统设计。 每个微服务负责处理一个特定的业务功能&#xff0c;并且这些服务可以独立开发、部署、扩展和管理&#xff0c;并且可以通讯。 它的核心思想就是解耦。 微服务和微前端是类…

FastText 和 Faiss 的初探了解

概览 大模型目前已经是如火如荼的程度&#xff0c;各个大厂都有推出面向大众的基础大模型&#xff0c;同时诸多行业也有在训练专有大模型&#xff0c;而大模型的发展由来却是经过多年从文本检索生成、深度学习、自然语言处理&#xff0c;在Transformer架构出来后&#xff0c;才…

前端基础知识+算法(一)

文章目录 算法二分查找条件注意方式基本原理左闭右闭正向写法 左闭右开正向写法 前端基础知识定时器及清除盒子垂直水平居中的方式垂直水平1.flex布局2.grid布局3.定位对于块级元素 解决高度塌陷的方式1.给父元素一个固定的高度2.给父元素添加属性 overflow: hidden;3.在子元素…

ip映射域名,一般用于mysql和redis的固定映射,方便快捷打包

举个例子 192.168.3.101mysql映射到mysql.smartlink.com 192.168.3.101redis redis.smartlink.com 要将IP地址映射到域名&#xff0c;可以通过几种方式实现&#xff0c;包括修改本地主机文件&#xff08;仅适用于本地开发环境&#xff09;、设置DNS解析&#xff08;适用于生产环…

java enum code-label模式的使用方法

通常我们定义的枚举类都会有两个字段&#xff1a;code、label&#xff0c;然后我们有会需要两个方法&#xff1a; 1.根据code获得枚举实例对象&#xff1a;getByCode 2.根据code获得对应的label&#xff1a;getLabelByCode 当然可以在每个枚举类中实现这两个方法&#xff0c;…

【字幕】恋上数据结构与算法之019动态数组07打印数组

是吧&#xff1f;什么意思呢&#xff1f;你看啊我们刚刚已经加了三个东西了&#xff0c;我现在希望能够打印一下这个速度&#xff0c;希望能把它里面所有元素打出来&#xff0c;那我们试一下&#xff0c;看它默认是怎么打&#xff0c;这个时候我们右击你会发现它打出来长这样子…

IDEA-调用Restful接口

告别Swagger3/Apifox/Postman Swagger3&#xff08;丝袜哥&#xff09; 地址&#xff1a;REST API Documentation Tool | Swagger UI简介&#xff1a;在java代码里面增加注解生成接口文档 在代码里面增加注解 RestController RequestMapping("api/v1/user") Api(ta…

Java外卖小程序管理系统

技术架构&#xff1a; springboot ssm mysql redis 有需要该项目的小伙伴可以添加我Q&#xff1a;598748873&#xff0c;备注&#xff1a;CSDN 功能描述&#xff1a; 商品管理&#xff1a;新增商品、所有商品 菜单管理&#xff1a;菜单管理、菜单分类 订单管理&#x…

<<编码>> 第 12 章 二进制加法器--8位加法器 示例电路

8 位加法器内部结构 info::操作说明 鼠标单击逻辑输入切换 0|1 状态 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/code-hlchs-examples/assets/circuit/code-hlchs-ch12-08-8-bit-adder-internal.txt 8 位加法器 info::操作说…