malloc与realloc的区别

2023-10-27

        ANSI C说明了三个用于存储空间动态分配的函数
(1) malloc 分配指定字节数的存储区。此存储区中的初始值不确定
(2) calloc 为指定长度的对象,分配能容纳其指定个数的存储空间。该空间中的每一位(bit)都初始化为0
(3) realloc 更改以前分配区的长度(增加或减少)。当增加长度时,可能需将以前分配区的内容移到另一个足够大的区域,而新增区域内的初始值则不确定。
        分配函数时再分配 realloc() ,使我们可以增、减以前分配区的长度(最常见的用法是增加该区)。如果先分配一个可容纳长度为512的数组的空间,并在运行时填充它,但又发现空间不够,则可调用realloc扩充该存储空间。如果在该存储区后有足够的空间可供扩充,则可在原存储区位置上向高地址方向扩充,并返回传送给它的同样的指针值。如果在原存储区后没有足够的空间,则realloc分配另一个足够大的存储区将现存的512个元素数组的内容复制到新分配的存储区。因为这种存储区可能会移动位置,所以不应当使用任何指针指在该区中。注意,realloc的最后一个参数是存储区的newsize(新长度),不是新、旧长度之差。作为一个特例,若ptr是一个空指针,则realloc的功能与malloc相同,用于分配一个指定长度newsize的存储区。

一.malloc

malloc的参数就是所需分配的字节数,malloc在c语言中不是关键字而是C函数库中提供的函数。调用malloc时就是在内存池中提取一块连续的空间,并返回这块内存的指针。代码示例:

#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
	int data;
	struct node *next;
}node;

node *create(int n)
{
	node *p = NULL, *head;
	head = (node*)malloc(sizeof (node ));
	p = head;
	node *s;
	int i = 1;

	if( 0 != n )
	{
		while( i <= n )
		{
			s = (node *)malloc(sizeof (node));
			s->data = i++;    // 为循环链表初始化,第一个结点为1,第二个结点为2。
			p->next = s;
			p = s;
		}
		s->next = head->next;
	}

	free(head);

	return s->next ;
}


二.realloc

void realloc(void *ptr,size_t new_size); ptr是指向原来地址的指针,这个函数用于修改一个原先已经分配内存块的大小。

使用:

1.可以使一块内存扩大或缩小(原来的内存块可以扩大缩小)

  (1.)如果是扩大一个内存块,则将原来的内存块保留在他的后边新增一块内存块(但是新增的内存块并未初始化)

  (2.)如果是缩小一块内存块,则将该内存块的后半部分直接拿掉,剩余部分内存块及其内容保留。

2.原来的内存块无法扩大缩小

   如果是着这种情况,realloc会重新开辟一个新的内存空间,并把原来的内存空间的内容拷贝到新的内存空间里。

注意:再调用完realloc后就不能使用指向就内存的指针,而是用返回的新的指针。

内存扩展如图所示。

值得一提的是:如果realloc中的第一个参数如果为空则和malloc一样

#include<Windows.h>
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
 
int main()
{
	const int size = 2000;
	int *p = (int *)malloc(20 * sizeof(int));
	int *p1 = (int *)realloc(p, size*sizeof(int));
	
	printf("%x\n", p);
	printf("%x\n", p1);
	system("pause");
	return 0;
}

--------------------- 
引用:https://blog.csdn.net/alidada_blog/article/details/80607267 

https://blog.csdn.net/u010137839/article/details/78643503

 

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

malloc与realloc的区别 的相关文章

  • 记录一次u-rate不生效的问题

    今天在写一个小程序项目的时候 使用u rate评分组件时 一直不显示 在测试uView是否正常引入 以及各个的引入是否有错外 在全部排查了之后 任何没有找到解决方案 于是我在想会不会是u rate组件中的某个属性导致了渲染失败 于是我在查看
  • ⚡文件工具类⚡

    目录 文件工具类的介绍 文件工具类的功能简介 stat接口 获取文件的大小 判断文件是否存在 获取文件最后一次进入时间 获取文件最后一次修改时间 获取文件名 获取文件的内容 往文件中写入内容 获取目录下所有文件的相对路径 压缩文件 解压文件
  • 深拷贝与浅拷贝【JavaScript基础面试题】

    浅拷贝 对象的浅拷贝 Object assign 使用 Object assign 该函数会拷贝assign 的第二个参数 比如下例中 我们会拷贝第二个参数 也就是obj1 const obj1 a 1 b 2 const obj2 Obj
  • Verilog 条件语句if else

    注意 只能在initial或always过程块语句中使用 生成latch 在时序逻辑中 不完整的 if else 结构并不会生成锁存器 而组合逻辑中不完整的 if else 结构就会生成锁存器 所以时序逻辑可以没有最后的else 默认保持
  • qt creator解决win10下显示界面过大的问题

    最终解决方法 https blog csdn net qq 43373204 article details 117166794 这种方法只能当时生效一次 https www jianshu com p 0368e5705c51
  • 鼠标移动效果

  • CSS中position属性( absolute

    本文为CSDN博主 夜之子 的原创文章 原文链接 https blog csdn net chen zw article details 8741365 我们先来看看CSS3 Api中对position属性的相关定义 static 无特殊定
  • Ubuntu的Linux下warning: implicit declaration of function ‘fork’ [-Wimplicit-function-declaration]解决方案

    一 问题描述 要编译运行的文件 include
  • C语言实现协程(一)

    目录 基本原理 协程管理 协程实现 引言 在使用socket编程时 我们会用到accept connect recv send等函数 这些函数在没有数据到达时 会阻塞等待IO数据的到达 这不利于我们处理多个连接并快速响应 一种方案是 服务端
  • 如何使用磁碟通(UltraISO)制作启动盘

    安装 1 双击运行安装程序 选择我接受协议 下一步 2 选择安装位置 点击下一步 3 点击下一步 4 点击安装等待即可 5 安装完毕后勾选立即运行 6 点击继续使用 进入界面即完成安装 使用 1 选择文件点击打开 找到自己已下载的镜像文件
  • 推挽输出和开漏输出的比较

    一 推挽输出 推挽输出的最大特点是可以真正能真正的输出高电平和低电平 在两种电平下都具有驱动能力 推挽输出的结构是由两个三极管或者MOS管受到互补信号的控制 两个管子始终保持一个处于截止 另一个处于导通的状态 电路工作时 两只对称的开关管每
  • How to Reduce Ground Bounce: Mitigating Noise with PCB Design Best Practices

    原文链接 https www allaboutcircuits com technical articles how to reduce ground bounce mitigating noise pcb design best prac
  • nginx报错

    一 nginx emerg server directive is not allowed here in usr local nginx conf nginx conf 45 一般这个报错 都是nginx conf配置文件修改的时候出错
  • LaTeX Error: File `citesort.sty' not found.

    在使用latex写论文时居然发现了所示的错误 然后网上一顿大找解决办法 最后发现是没有citesort sty这个包 然后又到网上下载了这个包 然后就直接放到latex的安装目录下面去了 发现还是不行 真是 最后直接把下载好的这个包放到当前
  • 多台服务器之间如何实现自动化的数据同步传输?

    企业的分支机构越来越多 跨区域跨国的集团越来越多 和外部合作伙伴之间的协作越来越多 跨组织跨地域之间的协作 都依赖于数据的交互 而这些数据大部分都是存储在服务器节点上的 所以 服务器之间的文件的自动化 高可靠同步调度 就尤为重要 目前来看
  • Webgl刷底色

    1 在html中建立canvas 画布
  • transient

    transient Java语言的关键字 用来表示一个域不是该对象串行化的一部分 当一个对象被串行化的时候 transient型变量的值不包括在串行化的表示中 然而非transient型的变量是被包括进去的 class A implemen
  • (附源码)springboot大学生防疫封校管理系统 毕业设计 632124

    大学生防疫封校管理系统 摘 要 2019年12月19号中国武汉发生第一例新冠病毒的到来 大家都在听从政府的号召在居家隔离 不管是在城市还是在乡镇 农村 这引起我的注目 设计一套大学生防疫封校管理系统 疫情防控需要大家共同努力 团结对校园学生
  • 算法通过村第一关——链表青铜挑战笔记

    题目一 理解Java是如何构造出链表的 单链表的内部结构 单链表中就像铁链一样 每个元素 节点 之间互相连接 包含多个节点 每个节点都有一个指向后继元素 节点 的next指针 最后一个元素的next指针指向null 如下图所示 Java单链
  • vba使用win32 API(GetOpenFileName )实现打开文件对话框

    2007年10月30日 11 19 00 使用网上比较普遍的vb中使用WindowsAPI实现打开文件对话框代码 Declare Function GetOpenFileName Lib comdlg32 dll Alias GetOpen

随机推荐

  • SMbus和I2C异同

    关于I2C与SMBus 许多人很少去谈论与了解两者的细节差异 包括很多国外的简报 文章也经常将两者混写 交杂描述 交替运用 确实 在一般运用下 I2C Bus与SMBus没有太大的差别 从实际接线上看也几乎无差异 甚至两者直接相连多半也能相
  • 【小沐学NLP】Python实现聊天机器人(微软Azure机器人服务)

    NLP开发系列相关文章编写如下 1 小沐学NLP Python实现词云图 2 小沐学NLP Python实现图片文字识别 3 小沐学NLP Python实现中文 英文分词 4 小沐学NLP Python实现聊天机器人 ELIZA 5 小沐学
  • (Kubernetes)k8s简介 docker安装

    Kubernetes 简介 Kubernetes 是一个自动化部署 伸缩和操作应用程序容器的开源平台 使用 Kubernetes 你可以快速 高效地满足用户以下的需求 快速精准地部署应用程序 即时伸缩你的应用程序 无缝展现新特征 限制硬件用
  • js中计算两个日期之间的月份差

    开始时间startDate 结束时间endDate var startDate 2019 12 30 var endDate 2020 04 28 startDate startDate split 得到月数 startDate parse
  • Android模拟器的文件目录介绍

    文件存放在 avd文件夹下 ini为对应的配置文件 打开 avd文件夹 lock文件夹保存的是模拟器的一下数据 当模拟器正常关闭时这些文件夹都会被自动删除 当模拟器无法开启的时候可以检查一下这几个文件夹是否存在 把所以的 lock文件夹删除
  • 解决“from exceptions import PendingDeprecationWarning ModuleNotFoundError: No module named ‘exception”

    如图
  • 使用C语言结构体实现面向对象

    1 构造属性与方法 struct Animal char name 128 int age char six 成员属性 void peat 成员方法 void pbeat int num 2 构造类 int mian struct Anim
  • TypeScript(五)类型别名及类型符号

    目录 引言 类型别名 基本用法 字面量类型 数字字面量 字符串字面量 布尔字面量 空字面量 枚举字面量 类型符号 联合类型 交叉类型 类型断言 尖括号 as关键字 非空断言 类型保护 typeof instanceof 类型谓词 索引类型
  • chatgpt赋能python:Python编程:如何删除前面的代码?

    Python编程 如何删除前面的代码 在Python编程中 我们有时会需要删除之前写的一些代码 以便更好地组织我们的代码结构和逻辑 那么 Python中如何删除前面的代码呢 在本文章中 我们将为您详细介绍Python中删除前面代码的几种方法
  • Springboot Redisson Xxljob(Druid MySQL MybatisPlus) 对接使用

    前情提要 根据xxl job提供的springboot的基本对接代码 Github spingboot对接代码地址 根据业务需求 框架中需要接入druid mysql redis redisson等组件和框架 在springboot xxl
  • Python GUI案例之看图猜成语开发(第一篇)

    Python GUI案例之看图猜成语 第一篇 前言 爬取素材篇 看图猜成语小程序开发 第一篇 游戏首页 游戏首页完整代码 Python GUI案例之看图猜成语开发 第二篇 Python GUI案例之看图猜成语开发 第三篇 Python GU
  • 决策树分析例题经典案例_分析模型案例解析:决策树分析法

    1 1 基本概念 决策树分析法又称概率分析决策方法 是指将构成决策方案的有关因素 以树状图形的方式表现出来 并据以分析和选择决策方案的一种系统分析法 它是风险型决策最常用的方法之一 特别式勇敢于分析比较复杂的问题 她以损益值为依据 比较不同
  • python3安装mmseg库

    python3安装mmseg库 常见安装方法 错误的 正确的方法 常见安装方法 错误的 pip install mmseg 结果会出现问题 一直提示报错 具体报错示例如下图所示 网上很难找到有效地解决方法 可能不同的环境会有不同的报错信息
  • 【软件测试】测试用例八要素

    测试用例八要素 根据禅道 1 测试用例编号 编号是由字母和数字组合而成的 用例的编号应该具有唯一性 易识别性 有且于其和测试结果 错误报告等其他文档的链接 这样看到编号就可以知道是做的什么测试 测试的对象是什么 也方便维护 系统测试 产品编
  • appium、selenium、webdriver运行原理图解

    整理的appium selenium webdriver的运行原理图解 如果有不对的地方还请提醒 参考 Appium Selenium Webdriver 运行原理与机制 Appium实现原理 Appium原理整理总结
  • ORM框架概述

    现在各大公司比较流行的ORM框架有MyBatis Hibernate Spring Data JPA等 甚至一些公司会进行封装后成为自己公司专用的框架 相信后端方向的各位小伙伴都知道 ORM框架就是连接数据库的桥梁 比较官方的说法叫 对象关
  • 一个简单的Golang实现的HTTP Proxy方法

    最近因为换了Mac 以前的Linux基本上不再使用了 但是我的SS代理还得用 SS代理大家都了解 一个很NB的socks代理工具 但是就是因为他是Socks的 想用HTTP代理的时候很不方便 以前在Linux下的时候 会安装一个Privox
  • nestjs:typeorm对数据库中用驼峰命名字段转蛇形命名

    参考 postgresql TypeORM and Postgres competing naming styles Stack Overflow 总结 npm i save typeorm naming strategies const
  • 高等数学知识总结

    因为某些算法题和数学有着密不可分的联系 因此 我决定将我大一这一年来学的高等数学做一个全面的总结 有些知识已经记得不算太清 如果有错误的地方还请大佬及时指出 第一章 函数 极限与连续 第1节 初等函数 这一节就是高中的一些基本初等函数的的复
  • malloc与realloc的区别

    ANSI C说明了三个用于存储空间动态分配的函数 1 malloc 分配指定字节数的存储区 此存储区中的初始值不确定 2 calloc 为指定长度的对象 分配能容纳其指定个数的存储空间 该空间中的每一位 bit 都初始化为0 3 reall