realloc函数和malloc函数解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: realloc函数和malloc函数解析

realloc函数和malloc函数都是用来动态分配内存的函数,但是它们有一些区别。


1.使用方法


malloc函数用于分配指定字节数的内存空间,并返回指向这段内存的指针。其函数原型为:


void *malloc(size_t size);


其中,size是要分配的内存空间的字节数。malloc函数返回的指针类型为void*,需要根据需要进行类型转换。如果内存分配失败,则返回NULL。


例如,1.下面的代码使用malloc函数分配了一个包括10个整数的数组:


int *ptr = malloc(10 * sizeof(int));
if (ptr != NULL) {
    // 内存分配成功,可以使用指针ptr访问这段内存
} else {
    // 内存分配失败
}

2.


QNode* newnode = (QNode*)malloc(sizeof(QNode));
  1. QNode* newnode: 声明了一个名为newnode的指针变量,该指针指向QNode类型的数据。
  2. malloc(sizeof(QNode)): 调用malloc函数分配了一块大小为QNode类型的内存空间。sizeof(QNode)用来获取QNode类型的数据占用的字节数。
  3. (QNode*): 强制将malloc函数返回的指针转换为QNode类型的指针。
  4. 最终将动态分配的内存地址赋值给newnode指针变量。

realloc函数用于重新分配已经分配的内存空间的大小。其函数原型为:


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


其中,ptr是之前由malloc或realloc返回的指针,size是要重新分配的内存空间的字节数。realloc函数会按照指定的大小重新分配内存,并返回指向新分配内存的指针。如果内存分配失败,则返回NULL。


例如,下面的代码使用realloc函数将之前分配的内存空间扩大为20个整数:



需要注意的是,使用realloc函数重新分配内存时,原来的指针ptr可能会变化,所以需要将返回的新指针重新赋值给原来的指针变量。


TDataType* temp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newcapacity);

STDataType* temp: 声明了一个名为temp的指针变量,该指针指向STDataType类型的数据。

realloc(ps->a, sizeof(STDataType) * newcapacity): 调用realloc函数重新分配了内存空间给指针变量ps->a。realloc函数接受两个参数,第一个参数是待重新分配内存的指针,第二个参数是重新分配后的内存大小。这里使用了sizeof(STDataType) * newcapacity来计算重新分配的内存大小,即每个STDataType类型的数据占用的字节数乘以newcapacity。

(STDataType*): 强制将realloc函数返回的指针转换为STDataType类型的指针。

最终将重新分配后的内存地址赋值给temp指针变量。

2.功能不同:


malloc函数用于分配指定大小的内存块,并返回指向该内存块的指针。

realloc函数用于重新分配已分配内存的大小。它接受一个已分配内存的指针和新的大小作为参数,并返回重新分配后的内存块的指针。如果新的大小大于原内存块的大小,则额外的内存空间将被分配,并且原内存块中的数据将被复制到新的内存块中;如果新的大小小于原内存块的大小,则原内存块中的数据可能会被截断或丢失。


3.参数不同:


malloc函数只接受一个参数,即要分配的内存块的大小。

realloc函数接受两个参数,第一个参数是已分配内存的指针,第二个参数是新的内存块的大小。


4.返回值不同:


malloc函数返回一个指向分配内存块的指针,如果分配失败,则返回NULL。

realloc函数返回一个指向重新分配内存块的指针,如果分配失败,则返回NULL。如果分配成功,该指针可能与原内存块的指针相同或不同。


5.用途不同:


malloc函数通常用于分配初始大小的内存块,比如数组、结构体等。

realloc函数通常用于在运行时根据需要调整内存块的大小,比如动态数组、字符串的扩展等。


总结起来,malloc函数用于分配指定大小的内存块,而realloc函数用于重新分配已分配内存的大小。

相关文章
|
2天前
|
存储 前端开发 JavaScript
前端基础(十二)_函数高级、全局变量和局部变量、 预解析(变量提升)、函数返回值
本文介绍了JavaScript中作用域的概念,包括全局变量和局部变量的区别,预解析机制(变量提升),以及函数返回值的使用和类型。通过具体示例讲解了变量的作用域、函数的返回值、以及如何通过return关键字从函数中返回数据。
7 1
前端基础(十二)_函数高级、全局变量和局部变量、 预解析(变量提升)、函数返回值
|
1月前
|
机器学习/深度学习 人工智能 PyTorch
掌握 PyTorch 张量乘法:八个关键函数与应用场景对比解析
PyTorch提供了几种张量乘法的方法,每种方法都是不同的,并且有不同的应用。我们来详细介绍每个方法,并且详细解释这些函数有什么区别:
39 4
掌握 PyTorch 张量乘法:八个关键函数与应用场景对比解析
|
2天前
|
设计模式 存储 算法
PHP中的设计模式:策略模式的深入解析与应用在软件开发的浩瀚海洋中,PHP以其独特的魅力和强大的功能吸引了无数开发者。作为一门历史悠久且广泛应用的编程语言,PHP不仅拥有丰富的内置函数和扩展库,还支持面向对象编程(OOP),为开发者提供了灵活而强大的工具集。在PHP的众多特性中,设计模式的应用尤为引人注目,它们如同精雕细琢的宝石,镶嵌在代码的肌理之中,让程序更加优雅、高效且易于维护。今天,我们就来深入探讨PHP中使用频率颇高的一种设计模式——策略模式。
本文旨在深入探讨PHP中的策略模式,从定义到实现,再到应用场景,全面剖析其在PHP编程中的应用价值。策略模式作为一种行为型设计模式,允许在运行时根据不同情况选择不同的算法或行为,极大地提高了代码的灵活性和可维护性。通过实例分析,本文将展示如何在PHP项目中有效利用策略模式来解决实际问题,并提升代码质量。
|
27天前
|
SQL 数据处理 数据库
|
27天前
|
SQL 关系型数据库 数据处理
|
2月前
|
数据处理 Python
深入探索:Python中的并发编程新纪元——协程与异步函数解析
【7月更文挑战第15天】Python 3.5+引入的协程和异步函数革新了并发编程。协程,轻量级线程,由程序控制切换,降低开销。异步函数是协程的高级形式,允许等待异步操作。通过`asyncio`库,如示例所示,能并发执行任务,提高I/O密集型任务效率,实现并发而非并行,优化CPU利用率。理解和掌握这些工具对于构建高效网络应用至关重要。
42 6
|
3月前
|
JavaScript 前端开发
jQuery 常用函数解析
jQuery 常用函数解析
|
29天前
|
监控 网络协议 Java
Tomcat源码解析】整体架构组成及核心组件
Tomcat,原名Catalina,是一款优雅轻盈的Web服务器,自4.x版本起扩展了JSP、EL等功能,超越了单纯的Servlet容器范畴。Servlet是Sun公司为Java编程Web应用制定的规范,Tomcat作为Servlet容器,负责构建Request与Response对象,并执行业务逻辑。
Tomcat源码解析】整体架构组成及核心组件
|
1月前
|
存储 NoSQL Redis
redis 6源码解析之 object
redis 6源码解析之 object
56 6
|
14天前
|
存储 缓存 Java
什么是线程池?从底层源码入手,深度解析线程池的工作原理
本文从底层源码入手,深度解析ThreadPoolExecutor底层源码,包括其核心字段、内部类和重要方法,另外对Executors工具类下的四种自带线程池源码进行解释。 阅读本文后,可以对线程池的工作原理、七大参数、生命周期、拒绝策略等内容拥有更深入的认识。
什么是线程池?从底层源码入手,深度解析线程池的工作原理

热门文章

最新文章

推荐镜像

更多