`
lizaochengwen
  • 浏览: 666658 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

malloc,alloc,realloc之间的相似与区别

 
阅读更多
三个函数的申明分别是:
void* realloc(void* ptr, unsigned newsize);
void* malloc(unsigned size);
void* calloc(size_t numElements, size_t sizeOfElement);
都在stdlib.h函数库内。它们的返回值都是请求系统分配的地址,如果请求失败就返回NULL。

malloc与calloc的区别为1块与n块的区别:
malloc调用形式为(类型*)malloc(size):在内存的动态存储区中分配一块长度为“size”字节的连续区域,返回该区域的首地址。
calloc调用形式为(类型*)calloc(n,size):在内存的动态存储区中分配n块长度为“size”字节的连续区域,返回首地址。
realloc调用形式为(类型*)realloc(*ptr,size):将ptr内存大小增大到size。(也可以缩小,缩小的内容消失)。

另外有一点不能直接看出的区别是,malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。calloc在动态分配完内存后,自动初始化该内存空间为零。



realloc有个细节需要注意:

无非就是将已经存在的一块内存扩大。

char* p = malloc(1024);
char* q = realloc(p,2048);
if (p! = q) {
free(p);
}

现在的问题是我们应该如何处理指针 p。 刚开始按照我最直观的理解,如果就是直接将 p = NULL;。 到最后只需要释放 q的空间就可以了。

因为最近在做个封装。结果在做单元测试的时候发现。有时候我在 free(q); 的时候会出错。这样我就郁闷了。

后来仔细一跟踪,发现 realloc 完以后 q 和 p 的指针地址是一样。不过有时候又不一样。

仔细查了下资料。得到如下信息:

       1.如果 当前连续内存块足够 realloc 的话,只是将p所指向的空间扩大,并返回p的指针地址。 这个时候 q 和 p 指向的地址是一样的。

       2.如果 当前连续内存块不够长度,再找一个足够长的地方,分配一块新的内存,q,并将 p指向的内容 copy到 q,返回 q。并将p所指向的内存空间删除。

这样也就是说 realloc 有时候会产生一个新的内存地址 有的时候不会。所以在分配完成后。我们需要判断下 p 是否等于 q。并做相应的处理。

这里有点要注意的是要避免 p = realloc(p,2048); 这种写法。有可能会造成 realloc 分配失败后,p原先所指向的内存地址丢失。





上段摘自:http://blog.csdn.net/snlying/article/details/4005238
分享到:
评论

相关推荐

    malloc:我使用系统mmap实现的libc malloc,realloc和free函数; 尺寸分割和优化的空间使用

    如果没有足够的空间来扩大ptr指向的内存分配,则realloc()创建一个新分配,复制“ ptr”指向的旧数据,使其与新分配的存储量一样多,释放旧分配,并返回指向已分配内存的指针。 free-释放“ ptr”指向的内存分配...

    alloc.h头文件

    《alloc.h头文件详解及其与malloc.h的区别》 在编程世界中,头文件扮演着至关重要的角色,它们包含了函数声明、常量定义以及各种类型声明等,为源代码提供了必要的接口信息。今天我们要讨论的是非标准头文件`alloc....

    内存分配与释放 alloc,free

    `free()`函数用于释放之前通过`malloc()`、`calloc()`或`realloc()`分配的内存。调用`free(ptr)`将释放`ptr`所指向的内存块,之后`ptr`就成为一个悬挂指针,不应再被使用。忘记释放内存会导致内存泄漏,这是程序错误...

    new 和 malloc区别.docx

    ### 新与malloc的区别详解 #### 一、概述 在C++编程中,动态内存管理是不可或缺的一部分,其中`new`和`malloc`是最常用的两种内存分配方式。虽然它们都能实现动态内存分配的功能,但在实现机制、语法使用以及功能...

    alloc_h.rar

    静态分配的内存生命周期与整个程序相同,即使在函数执行完毕后,内存仍然保留,但不可在函数之间共享。 2. 栈分配:当函数被调用时,系统会为该函数的局部变量和参数分配内存,这就是栈分配。一旦函数返回,这些...

    realloc函数使用总结

    realloc原型是extern void *realloc...  #include <stdlib> 有些编译器需要#include <malloc>,在TC2.0中可以使用alloc.h头文件  功能  先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地

    alloc_dyn_mem.rar_memory

    在动态内存分配中,使用`malloc()`、`calloc()`、`realloc()` 和 `free()` 函数来管理内存。 `malloc()` 用于分配指定大小的字节数组,返回一个指向该内存块的指针。例如,如果我们要创建一个存储整数的向量,可以...

    prom_alloc.rar_Free!

    在这个场景下,我们关注的是堆式分配,即通过`malloc`、`calloc`、`realloc`等函数动态申请内存,以及用`free`来释放这些内存。`prom_alloc`可能是对这些标准函数的一种扩展或者优化,例如为了实现内存池,提高内存...

Global site tag (gtag.js) - Google Analytics