首页 > 系统相关 >c语言malloc、calloc 和 realloc动态分配内存函数的区别

c语言malloc、calloc 和 realloc动态分配内存函数的区别

时间:2024-06-30 21:42:01浏览次数:19  
标签:malloc realloc 分配内存 内存 calloc 分配

c语言malloc、calloc 和 realloc动态分配内存函数的区别

malloc、calloc和realloc是C语言中用于动态内存分配的三个重要函数,它们之间有一些关键的区别。以下是这三个函数的区别,以分点表示和归纳的形式进行解释:

  1. 内存来源和初始化:
    • malloc:在堆上分配指定大小的内存块,但不进行初始化。分配的内存内容是不确定的,可能包含垃圾数据。
    • calloc:也在堆上分配内存,但与malloc不同,它会将分配的内存块中的每一位都初始化为零(因此也被称为“零初始化内存分配器”)。calloc需要两个参数:一个是要分配的元素数量,另一个是每个元素的大小。
    • realloc:用于调整已分配内存块的大小。它接收一个指向现有内存块的指针和新的大小作为参数,并尝试就地扩展或缩小内存块。如果就地扩展失败,它会分配一个新的内存块,并将原始数据复制到新位置。
  2. 参数和返回值:
    • malloc:参数为所需内存块的大小(以字节为单位),返回值为void *类型,需要显式转换为适当的指针类型。
    • calloc:参数为所需元素的数量和每个元素的大小,返回值为void *类型,也需要显式转换。
    • realloc:第一个参数为指向要调整大小的内存块的指针,第二个参数为新的大小(以字节为单位)。如果成功,它返回调整大小后的内存块的新地址(可能与原始地址相同,也可能不同)。如果失败,则返回NULL,并且原始内存块保持不变。
  3. 内存释放:
    • 所有这三个函数分配的内存都需要通过free函数来释放,以避免内存泄漏。当realloc失败时,它不会释放原始内存块,因此调用者需要负责在适当的时候使用free来释放它。
  4. 性能和开销:
    • 由于calloc需要对内存进行初始化,因此它在性能上可能略慢于malloc。此外,由于calloc需要存储额外的信息(如元素数量和每个元素的大小),因此它分配的内存块可能比使用malloc时稍大一些。
    • realloc在进行内存调整时可能涉及数据的复制,因此也可能比简单的malloccalloc调用更耗时。
  5. 使用场景:
    • 当需要分配一块指定大小的内存,并且不关心其内容时,可以使用malloc
    • 当需要分配一块内存,并确保其内容为零时,应该使用calloc
    • 当需要调整已分配内存块的大小时,应该使用realloc

标签:malloc,realloc,分配内存,内存,calloc,分配
From: https://www.cnblogs.com/zkbklink/p/18277009

相关文章

  • Malloc Lab: Writing a Dynamic Storage Allocator
    18-213/15-613,Summer2024MallocLab:WritingaDynamicStorageAllocatorAssigned:Thursday,June20,2024Thislabrequiressubmittingtwoversionsofyourcode:oneasaninitialcheckpoint,andthesecondasyourfinalversion.Theduedatesofeachp......
  • 高性能版本的零内存分配LikeString函数(ZeroMemAllocLikeOperator)
    继上一篇文章在.NETCore,除了VB的LikeString,还有其它方法吗?(四种LikeString实现分享)分享了四种实现方式,笔者对这四种实现方式,不管是执行性能还是内存分配性能上,都不太满意。那么是否有好的实现方法呢?答案是有的。今天我们就搬出ReadOnlySpan<T>这个非常好用的结构类型,它是在.N......
  • glibc函数malloc的工作原理
    glibc提供了malloc函数来动态分配内存,我们只知道调用malloc会返回给我们一个指针,指向一块内存空间或NULL,那么malloc的工作原理是什么呢?概述:1.小于128kB的空间,使用内存池(在堆上)或brk或sbrk系统调用在堆上分配2.大于128kB的空间,使用mmap在文件映射区分配+----------------......
  • linux内存管理(二)- vmalloc
    个人笔记,谨慎观看.先看看vmalloc是怎么实现的。它能在非连续物理内存之上建立连续的虚拟内存映射。这里有一篇博客Linux内存管理(6)vmalloc-ArnoldLu-博客园(cnblogs.com)调用链vmalloc->_vmalloc_node->_vmalloc_node_rangevoid*__vmalloc_node(unsignedlongsize,......
  • 深入理解 C++ 动态内存管理:new vs malloc
    概述new/delete 是C++的关键字,需要编译器支持。malloc/free 是库函数,需要头文件支持。使用 new 申请内存分配时无需指定内存块大小,编译器会自动计算。而 malloc 需要明确指定所需内存的大小。new 会返回对象类型的指针,类型安全。而 malloc 返回 void*,需要进行强制......
  • C# 使用 stackalloc 在栈上分配内存
    stackalloc官方文档https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/stackallocAstackallocexpressionallocatesablockofmemoryonthestack.Astack-allocatedmemoryblockcreatedduringthemethodexecutionisautomaticallyd......
  • malloc()函数
    malloc()函数malloc是动态内存分配函数,用于申请一块连续的指定大小的内存块区域,以void*类型返回分配的内存区域地址。函数原型void*malloc(unsignedintnum_bytes);分配长度为num_bytes字节的内存块。使用时要包含头文件stdlib.h,也可以使用#include<malloc.h>,但并不建议,......
  • TCmalloc
    什么是TCMalloc?它与标准内存分配器有何不同?传统的内存分配器:使用全局堆管理,如glibc,malloc所有内存分配和释放都需要用到全局锁,导致高并发下锁竞争严重内存碎片管理:碎片化问题严重每次操作都需要经过经过全局堆结构对于memorycache和CentralCach,内部都是维护了不同类型......
  • cnetos 7.9 编译安装 jemalloc
    centos7.9编译安装jemalloc编译安装下载地址本人安装的是5.3.0版本下载后解压,cd到解压目录执行:./autogen.sh--prefix=/xx/xxxmakemakeinstall使用编译程序时加上-L/xx/xxx/lib-ljemalloc-Wl,-rpath=/xx/xxx/lib-I/xx/xxx/include/jemalloc程序中的mallo......
  • struct和malloc内存互转例子
    #include<iostream>typedefstructDS1001{unsignedinta;unsignedcharb;unsignedintc;unsignedchard;unsignedshorte;}DS1001;voidTestMallocToStruct(){intnsize=sizeof(DS1001);unsignedchar*mallocdat......