【C语言】动态内存管理常用函数

前言

我们在之前学习的数组开辟的空间是固定不变的,有时候我们需要的空间⼤⼩在程序运⾏的时候才能知道~

c语言中的动态内存开辟,让程序员⾃⼰可以根据实际需求申请和释放相应空间,这使得空间的开辟变得灵活了许多。

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~

目录

前言

malloc函数

malloc函数的使用

free函数

free函数的使用

calloc函数

calloc函数的使用

realloc函数

realloc函数的使用

realloc与malloc函数的联系


malloc函数

void* malloc (size_t size);

malloc函数的作用是开辟动态内存

这个函数向内存申请⼀块连续可⽤的空间,并返回指向这块空间的指针

  • 如果开辟成功,则返回⼀个指向开辟好空间的指针。
  • 如果开辟失败,则返回⼀个 NULL 指针,因此malloc的返回值⼀定要做检查。

返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使⽤的时候使⽤者⾃⼰来决定。

如果参数 size 为0,malloc的⾏为是标准是未定义的,取决于编译器。

malloc 申请的空间是在内存的堆区

malloc函数的使用


#include<stdio.h>
#include<stdlib.h>//malloc所涉及的头文件
int main()
{
	//int arr[10] = { 0 };//开辟的空间不可以更改,固定死了
	//void* malloc (size_t size)  size的单位是字节
	//malloc函数只知道申请空间,不知道返回类型是什么
	int* p=(int*)malloc(40);//向内存申请40个字节的空间,他的返回值是void*
	//强制类型转换成int*后,再赋值给指针变量p,就相当于int arr[10]
	if (p == NULL)//判断p指针是否为空
	{
		perror("malloc");
		return 1;
	}
	//访问并使用malloc开辟的空间
	for (int i = 0; i < 10; i++)
	{
		*(p+i)=i;
	}
	//打印
	for (int i = 0; i < 10; i++)
	{
		printf("%d " ,* (p + i));
	}

	return 0;
}

free函数

void free (void* ptr);

free函数⽤来释放动态开辟的内存。

  • 如果参数 ptr 指向的空间不是动态开辟的,那free函数的⾏为是未定义的。
  • 如果参数 ptr 是NULL指针,则函数什么事都不做。

malloc和free都声明在 stdlib.h 头⽂件中。

free函数的使用

	//释放空间
	free(p);
	p = NULL;//用free释放空间后,空间释放了,但p仍然记得地址起始位置
	//避免p变为野指针,将p设为NULL

calloc函数

void* calloc (size_t num, size_t size);

  • calloc函数也是⽤来动态内存分配。与malloc函数的区别 是calloc函数会将值全部初始化为0而malloc函数不会
  • calloc函数的功能是num 个⼤⼩为 size 的元素开辟⼀块空间

calloc函数的使用

int main()
{//                  元素个数,元素大小
	int* p = (int*)calloc(10,sizeof(int));
	if (p == NULL)//判断p指针是否为空
	{
		perror("calloc");
		return 1;
	}
	//calloc函数会将值全部初始化为0
	//打印
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", *(p + i));
	}
	//释放空间
	free(p);
    p=NULL;
    //避免p变为野指针,将p设为NULLz	
    return 0;
}

realloc函数

void* realloc (void* ptr, size_t size);

realloc函数开辟空间有两种情况:

  1. 原空间后面有足够的空间,直接扩大,返回原空间的起始地址
  2. 原空间后面没有足够的空间,realloc会在堆区重新找一个空间(满足需求的),并且把原数据拷贝到新的空间,然后释放旧的空间,同时返回新空间的起始位置

realloc函数的使用

#include<stdio.h>
#include<stdlib.h>
int main()
{

	int* p=(int*)malloc(40);
	if (p == NULL)//判断p指针是否为空
	{
		perror("malloc");
		return 1;
	}
	//若空间不够,想要扩大空间,20个整形
//参数:(指针,想要变成的大小)
	int* ptr = (int*)realloc(p, 20 * sizeof(int));
	if (ptr != NULL)//先把判断ptr是否为空指针,再把ptr赋值给p
	{//若直接用p接收,若开辟空间失败,p会被置为NULL,造成原空间找不到了
		p = ptr;
	}
	else
	{
		perror("realloc");
	}
//	realloc函数不会初始化空间
//	使用空间
	for (int i = 0; i < 20; i++)
	{
		*(p+i)=i;
	}
	//打印
	for (int i = 0; i < 20; i++)
	{
		printf("%d " ,* (p + i));
	}
	//释放空间
	free(p);
	p = NULL;
	return 0;
}

realloc与malloc函数的联系

以下代码的意思是将指针为NULL的地址扩为40字节空间,相当于使用malloc函数开辟空间


int main()
{
	int* p = (int*)realloc(NULL, 40);//等价于malloc
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++进阶】哈希表的闭散列和开散列(哈希桶)的代码实现

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

mariadb数据库——安装,创建数据库

MariaDB是一个流行的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它是MySQL的一个分支。 安装 apt -y install mariadb-servervi /etc/mysql/mariadb.conf.d/50-server.cnf character-set-server utf8mb4 collation-server utf8mb4_general_c…

什么时候要用到Reflect API?

参考文档 https://www.zhihu.com/question/460133198 https://cn.vuejs.org/guide/extras/reactivity-in-depth.html https://juejin.cn/post/7103764386220769311 Reflect API 一般搭配 Proxy API 一起使用。什么是 Proxy API 呢&#xff1f; 先回顾下 vue 的数据响应性是如何…

【已解决】卸载软件时显示“无法使用此产品的安装源,请确认安装源存在,并且你可以访问它”报错截图如下

卸载软件时显示“无法使用此产品的安装源&#xff0c;请确认安装源存在&#xff0c;并且你可以访问它”报错截图如下 使用Uninstall Tool软件强制删除&#xff0c;绕过软件自带的uninstall程序。&#xff08;小白推荐&#xff0c;如下图&#xff09; Uninstall Tool - Unique…

【DAY06 软考中级备考笔记】数据结构:树

数据结构&#xff1a;树 3月1日 – 天气&#xff1a;晴 之前在B站看的视频讲的是在太过简单&#xff0c;弃了。现在换了新的视频继续&#xff0c;后续会重新看前面的视频补过来。https://www.bilibili.com/video/BV1pT4m1S7uH/ 1. 树的基本概念 需要注意的是&#xff1a; 并不是…

代码随想录算法训练营第五天

● 自己看到题目的第一想法 242. 有效的字母异位词 方法&#xff1a; 方法一&#xff1a; 暴力法 1. 分别对s, t排序 2. 遍历s与t 判断s[i]!t[i] 返回 false 否则 返回true思路&#xff1a; 注意&#xff1a; 代码&#xff1a; bool cmp(char a, char b){return a<b;…

解决GitHub无法访问的问题:手动修改hosts文件与使用SwitchHosts工具

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

Node.js+Express后端,自定义接口

6分钟学会Express 后端 API 开发 Node.js 2020最新版_哔哩哔哩_bilibili 要使用Node.js和Express搭建一个简单的后台服务器&#xff0c;用于接收带有token的请求头&#xff0c;你可以按照以下步骤进行操作&#xff1a; 首先&#xff0c;确保你已经安装了Node.js和npm&#xff0…

OpenAI员工自曝996作息表,网友:真正的卷不需要强迫

鱼羊 发自 凹非寺 量子位 | 公众号 QbitAI OpenAI也996&#xff0c;实锤了&#xff08;doge&#xff09;。 思维链作者、从谷歌跳槽OpenAI的Jason Wei刚刚分享了自己在OpenAI的一天&#xff1a; [9:00am] 起床 [9:30am] 搭乘Waymo前往Mission SF&#xff0c;途中在Tartine买…

一篇文章带你搞定企业级完整性能测试流程

大部分公司在最初试的阶段只会关心项目的基本功能&#xff0c;能用就可以。但是随着项目的成熟&#xff0c;用户量逐步的增大&#xff0c;线上经常就会出现一些系统崩溃&#xff0c;用户反映系统太慢等性能问题的爆发。所以&#xff0c;性能测试的需求就逐步变得迫切了。所以&a…

【笔记】深度学习入门:基于Python的理论与实现(六)

深度学习 深度学习是加深了层的深度神经网络 加深网络 本节我们将这些已经学过的技术汇总起来&#xff0c;创建一个深度网络&#xff0c;挑战 MNIST 数据集的手写数字识别 向更深的网络出发 基于33的小型滤波器的卷积层。激活函数是ReLU。全连接层的后面使用Dropout层。基…

varFormatter 数据格式化库 以性能优先的 快速的 内存对象格式转换

varFormatter 数据格式化 技术 开源技术栏 对象/变量格式化工具库&#xff0c;其支持将一个对象进行按照 JSON XML HTML 等格式进行转换&#xff0c;并获取到结果字符串&#xff01; 目录 文章目录 varFormatter 数据格式化 技术目录介绍获取方式 使用实例格式化组件的基本使…

【C++初阶】内存管理

目录 一.C语言中的动态内存管理方式 二.C中的内存管理方式 1.new/delete操作内置类型 2.new和delete操作自定义类型 3.浅识抛异常 &#xff08;内存申请失败&#xff09; 4.new和delete操作自定义类型 三.new和delete的实现原理 1.内置类型 2.自定义类型 一.C语…

电机应用-正点原子直流有刷电机例程笔记

目录 基础驱动实验&#xff1a;调速和换向 初始化工作 电机基础驱动API 电压、电流、温度检测实验 初始化工作 采集工作 编码器测速实验 编码器接口计数原理 初始化工作 编码器测速工作 速度环控制实现 PID相关函数 PID运算 电流环控制实现 PID相关函数 PID运算…

代码随想录算法训练营第三十三天|1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果

1005.K次取反后最大化的数组和 刷题https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/description/文章讲解https://programmercarl.com/1005.K%E6%AC%A1%E5%8F%96%E5%8F%8D%E5%90%8E%E6%9C%80%E5%A4%A7%E5%8C%96%E7%9A%84%E6%95%B0%E7%BB%84%E5%92%8C.…

iOS-设置指定边圆角(左上、左下等)

以UILabel举例&#xff0c;效果图如下&#xff1a; 代码如下&#xff1a; //设置左上与右下圆角&#xff08;可自行编辑指定圆角位置&#xff09; UIBezierPath *maskPath [UIBezierPath bezierPathWithRoundedRect:_sleepStateLabel.bounds byRoundingCorners:UIRectCornerT…

Python 全栈系列227 部署chatglm3-API接口

说明 上一篇介绍了基于算力租用的方式部署chatglm3, 见文章&#xff1b;本篇接着看如何使用API方式进行使用。 内容 1 官方接口 详情可见接口调用文档 调用有两种方式&#xff0c;SDK包和Http。一般来说&#xff0c;用SDK会省事一些。 以下是Python SDK包的git项目地址 安…

“环波罗的海”包围圈将正式形成

据“直新闻”的消息称&#xff0c;近日匈牙利国会同意了瑞典加入北约的申请&#xff0c;在走完相关后续程序后&#xff0c;瑞典就将成为北约第三十二个成员国&#xff0c;而北约对俄罗斯打造的“环波罗的海”包围圈也将正式形成&#xff0c;即除俄方外&#xff0c;波罗的海周边…

JEECG_ExcelExportServer批量数据导出超过60000条

项目上线了,结果导出数据时发现只能导出6w条,好奇怪啊... 本地试了试结果每次都卡在10w条. orz 开始扒拉批量导出 ExcelBatchExportServer server new ExcelBatchExportServer();server.init(exportParams,TTransLine.class);server.write(exportList);Workbook workbook s…

github如果给第三方项目提PR(Pull Request)

参考&#xff1a; https://blog.csdn.net/Leventcoco/article/details/135871779 1&#xff09;第一步 先fork第三方项目 点击fork然后就同步一份到自己名下了&#xff0c;后续修改在自己名下这项目上先修改&#xff1a; 2&#xff09;修改项目&#xff08;要提交的新功能或…