C语言动态内存开辟,malloc,calloc,free,realloc函数使用

2023-11-19

目录

一、内存的动态分配

1.函数malloc

2.函数calloc

3.函数realloc

4.函数free

关于动态内存错误的操作案例:


一、内存的动态分配

1.函数malloc

函数原型:void* malloc ( size_t size );
这个函数向内存申请一块 连续可用 的空间,并返回指向这块空间的指针。
如果开辟成功,则返回一个指向开辟好空间的指针。
如果开辟失败,则返回一个 NULL 指针,因此 malloc 的返回值一定要做检查。
返回值的类型是 void* ,所以 malloc 函数并不知道开辟空间的类型,具体在使用的时候使用者自己
来决定,可以进行强制类型转换来变成自己想要的类型。
如果参数 size 0 malloc 的行为是标准是未定义的,取决于编译器。
举个例子:
int main()
{
	//假设开辟10个整形空间
	int arr[10] = { 0 };//在栈区
	//动态内存开辟
	int  *p=(int *)malloc(10*sizeof(int));//return值 void * ,需强制类型转换
	//使用这些空间的时候,先判断是否开辟成功
	if (NULL == p)
	{
		perror("main");//main: xxxxxxx
		return 0;
	}
	//使用,赋值
	int i = 0;
	for ( i = 0; i < 10; i++)
	{
		*(p + i) = i;
	}
	for ( i = 0; i < 10; i++)
	{
		printf("%d\n", p[i]);
	}
	//回收空间
	free(p);//传的是值,不会吧p置成NULL 
	p = NULL;
	return 0;
}

输出结果:

2.函数calloc

函数原型:void* calloc (size_t num, size_t size);

函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0。

与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0

举个例子:

int main()
{
	//假设开辟10个整形空间
	//int arr[10] = { 0 };//栈区
	//动态内存开辟
	//int* p = (int*)malloc(10 * sizeof(int));//return值 void *
	int* p = calloc(10, sizeof(int));//初始化为0
	//使用这些空间的时候
	if (NULL == p)
	{
		perror("main");//main: xxxxxxx
		return 0;
	}
	//使用
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		//*(p + i) = i;
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d\n", *(p+i));
	}
	//回收空间
	free(p);//传的是值,不会把p置成NULL 
	p = NULL;

	return 0;
}

输出结果:

3.函数realloc

函数原型:void* realloc ( void* ptr , size_t size );
realloc 函数的出现让动态内存管理更加灵活。
有时会我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的时
候内存,我们一定会对内存的大小做灵活的调整。那 realloc 函数就可以做到对动态开辟内存大小
的调整。
ptr:  是要调整的内存地址
size:  调整之后新大小
返回值为调整之后的内存起始位置。
这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到 的空间。
举个例子:
int main()
{
	int* p = (int*)calloc(10, sizeof(int));//初始化为0
	//使用这些空间的时候
	if (NULL == p)
	{
		perror("main");//main: xxxxxxx
		return 1;
	}
	//使用
	for (int i = 0; i < 10; i++)
	{
		*(p + i) = 5;
	}
	int* ptr = (int*)realloc(p, 20 * sizeof(int));//对动态开辟内存大小的调整为20 * sizeof(int)大小。
	if (ptr != NULL)
	{
		p = ptr;
	}
	for (int i = 0; i < 20; i++)
	{
		printf("%d\n", *(p + i));
	}
	free(p);
	p = NULL;
	//int* p = realloc(NULL, 10 * sizeof(int));//这里功能类似于malloc,就是直接在堆区里面开辟
	return 0;
}

输出结果:

注意事项:

realloc 在调整内存空间的是存在两种情况:
情况 1 :原有空间之后有足够大的空间
情况 2 :原有空间之后没有足够大的空间

4.函数free

函数原型:void free ( void* ptr );
free 函数用来释放动态开辟的内存。
如果参数 ptr 指向的空间不是动态开辟的,那 free 函数的行为是未定义的。
如果参数 ptr NULL 指针,则函数什么事都不做。
忘记释放不再使用的动态开辟的空间会造成内存泄漏。
切记:
动态开辟的空间一定要释放,并且正确释放

关于动态内存错误的操作案例转另一篇文章:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言动态内存开辟,malloc,calloc,free,realloc函数使用 的相关文章

随机推荐

  • ubuntu安装最新版docker简易教程

    Ubuntu Docker 安装 Docker Engine Community 支持以下的 Ubuntu 版本 Xenial 16 04 LTS Bionic 18 04 LTS Cosmic 18 10 Disco 19 04 其他更新
  • pyecharts源码解读(17)HTML组件包components之表格组件Table

    当前pyecharts的版本为1 9 0 components包概述 components包位于pyecharts包顶级目录中 用于定义pyecharts的HTML组件 包结构如下 components HTML组件包 image py 定
  • python注意事项2

    工具pycharm 1 字符串的方法 hello str hello world 以什么开始 hello str startwith h 以什么结束 hello str endwith 去除空白字符 string lstrip 去除左边的空
  • 【Docker网络】Docker的容器互联

    Docker网络 Docker的容器互联 一 Docker容器互联介绍 1 1 Docker容器互联简介 1 2 Docker容器互联方式 二 本次实践介绍 2 1 本地环境规划 2 2 本次实践介绍 三 默认网络下的容器互联 3 1 默认
  • ABB PFEA111-20 3BSE050090R20处理器模块

    处理能力 PFEA111 20 处理器模块可能具备高性能的处理能力 能够执行复杂的控制算法 逻辑运算和数据处理任务 多通道输入输出 该模块可能会提供多个数字或模拟输入通道 用于监测外部信号 以及多个输出通道 用于控制执行器和设备 通信接口
  • 测试自动化面试题

    Python python有哪些数据类型 Python支持多种数据类型 包括以下常见的数据类型 数字类型 整数 int 浮点数 float 和复数 complex 字符串类型 由字符组成的不可变序列 使用引号 单引号或双引号 括起来 列表
  • 机器学习(三)K-means聚类(手肘法、轮廓系数、可视化代码)

    K means聚类 聚类是无监督学习当中非常重要的一部分 能够在没有标签的情况下将数据分类 说到聚类 最常用也是最重要的一个算法就是K means算法 算法介绍 K means是一种非常简单快速高效的算法 只需要迭代几次即可 其原理用一句话
  • linux---"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message

    2020年3月14日服务器异常重启 查看 var log message日志 如下 Mar 14 15 04 59 localhost kernel azx single send cmd 11 callbacks suppressed M
  • GLES3.0中文API-glGetProgramResource

    名称 glGetProgramResource 检索程序对象中单个活动资源的多个属性的值 C 规范 void glGetProgramResourceiv GLuint program GLenum programInterface GLu
  • flask模块mock接口(一)

    目录 一 安装第三方模块 二 flask模块的使用 三 动态路由 四 返回json格式数据 有时候测试需要调用第三方接口进行测试 但是第三方接口没有提供时 我们可以通过mock接口模拟第三方接口 一 安装第三方
  • UNITY3D 实现暂停(Coroutine)

    前断时间在做一个游戏项目 为了实现暂停还有游戏逻辑中用yield 自己写了一个类 代码如下 using UnityEngine using System Collections if want gameobject pause Updata
  • 嵌入式基础常识

    一 基本概念 linux ubuntu 用户名 类型 普通用户 系统名称 家目录 root 管理员用户 pwd 显示当前工作路径 绝对路径 home linux 家目录 根目录下 代表根目录 ls 列出文件状态 选项 l i h 1 rwx
  • BUUCTF-千层套路(python脚本)

    zip层层压缩 写脚本爆破 import zipfile import os current path r C Users SoberJoker Downloads attachment if name main pwd ls os lis
  • 【经典】IDEA+DevTools热部署

    IDEA DevTools实现热部署功能 热部署 大家都知道在项目开发过程中 常常会改动页面数据或者修改数据结构 为了显示改动效果 往往需要重启应用查看改变效果 其实就是重新编译生成了新的Class文件 这个文件里记录着和代码等对应的各种信
  • 电脑浏览器换IP怎么换?四种浏览器教程一起看看吧。【芝麻http】

    浏览器设置代理IP上网是代理IP最基础的使用方法 不同的浏览器设置代理IP的方法略有不同 下面就几种常用的浏览器如何设置代理IP进行说明 一 IE浏览器设置代理IP IE浏览器无疑是最常用的浏览器 而像360浏览器 搜狗浏览器 QQ浏览器这
  • C++中的.和->

    C 中的 和 gt 1 C 中的点 的应用 如果是一个对象或者引用去调用成员变量或者成员函数函数的话 会使用到点 include
  • vue-cli webpack配置cdn路径 以及 上线之后的字体文件跨域处理

    昨天搞了一下vue项目打包之后静态资源走阿里云cdn 配置了半天 终于找到了设置的地方 config index js 里面设置build 下的 assetsPublicPath 打包的时候便可以添加公共前缀路径 assetsSubDire
  • c++ 封装

    目录 封装的意义一 封装的意义二 struct和class区别 成员属性设置为私有 封装的意义一 封装是c 面向对象的三大特征之一 1 将属性和行为作为一个整体 表现生活中的事物
  • 阿里云在线扩展云盘记录-ubuntu系统

    fdisk l 查看真实磁盘大小 apt get update 更新库 apt get install y cloud guest utils 安装命令 growpart dev vda 1 扩容命令在线扩展磁盘 若报错 执行以下操作 LA
  • C语言动态内存开辟,malloc,calloc,free,realloc函数使用

    目录 一 内存的动态分配 1 函数malloc 2 函数calloc 3 函数realloc 4 函数free 关于动态内存错误的操作案例 一 内存的动态分配 1 函数malloc 函数原型 void malloc size t size