realloc函数和malloc函数解析

本文涉及的产品
云解析DNS-重点域名监控,免费拨测 20万次(价值200元)
简介: 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函数用于重新分配已分配内存的大小。

相关文章
|
SQL 数据挖掘 测试技术
南大通用GBase8s数据库:LISTAGG函数的解析
南大通用GBase8s数据库:LISTAGG函数的解析
|
C语言 开发者
【C语言】断言函数 -《深入解析C语言调试利器 !》
断言(assert)是一种调试工具,用于在程序运行时检查某些条件是否成立。如果条件不成立,断言会触发错误,并通常会终止程序的执行。断言有助于在开发和测试阶段捕捉逻辑错误。
302 5
|
机器学习/深度学习 自然语言处理 语音技术
揭秘深度学习中的注意力机制:兼容性函数的深度解析
揭秘深度学习中的注意力机制:兼容性函数的深度解析
|
存储
atoi函数解析以及自定义类型经典练习题
atoi函数解析以及自定义类型经典练习题
326 0
|
数据处理 Python
深入探索:Python中的并发编程新纪元——协程与异步函数解析
深入探索:Python中的并发编程新纪元——协程与异步函数解析
146 3
|
机器学习/深度学习 算法 C语言
【Python】Math--数学函数(详细附解析~)
【Python】Math--数学函数(详细附解析~)
|
安全 编译器 C++
【C++篇】C++类与对象深度解析(三):类的默认成员函数详解
【C++篇】C++类与对象深度解析(三):类的默认成员函数详解
118 3
|
9月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
864 29
|
9月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
355 4
|
9月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

推荐镜像

更多
  • DNS