三个函数的申明分别是:
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,calloc,realloc的对比
作者:陶宁,华清远见嵌入式学院讲师。 相关函数原型: 1. Malloc ... 作 用: Malloc用于动态申请存储空间,它不是关键字,而是一个申请内存的函数 ... 3.realloc 作 用:重新分配内存空间。 例 子:
以下是对c语言中的malloc函数,realloc函数与calloc函数的区别以及它们之间的联系进行了介绍,需要的朋友可以过来参考下
C中堆管理—浅谈malloc,calloc,realloc 函数之间的区别 详情:http://blog.csdn.net/fjb2080
在程序的执行期间分配内存时,内存区域中的这个空间称为堆(heap)。还有另一个内存区域,称为栈(stack),... C函数库中的malloc和free分别用于执行动态内存分配和释放。这两个函数的原型如下所示,他们都在头文件st
跟踪对 malloc、realloc 和 free 的调用 用法 可以像这样使用LD_PRELOAD加载共享对象 LD_PRELOAD=heap_trace.so ./executable 例子 heaptrace 将输出有关 malloc、realloc 和 free 调用的信息 父函数的地址或已解析...
如果没有足够的空间来扩大ptr指向的内存分配,则realloc()创建一个新分配,复制“ ptr”指向的旧数据,使其与新分配的存储量一样多,释放旧分配,并返回指向已分配内存的指针。 free-释放“ ptr”指向的内存分配...
内存分配 学校项目,其中包括重新编码stdlib函数malloc,realloc和free
11_new&delete与malloc&free 之间的关系与区别1
1 ,malloc 与free 是C++/C 语言的标准库函数,new/delete 是C++ 的运算符。它们都可用于申请动态内存和释放内存。 2 ,对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要...
主要介绍了C语言中 malloc、calloc、realloc的区别的相关资料,需要的朋友可以参考下
new与malloc 的区别和用法 new与malloc 的区别和用法 new与malloc 的区别和用法 new与malloc 的区别和用法 new与malloc 的区别和用法 new与malloc 的区别和用法 new与malloc 的区别和用法
本程序是一个在模拟器上定位BREW应用程序内存泄露位置的工具,可以给出内存泄露位置的调用栈信息(包括MALLOC/REALLOC被调用的位置,也能定位到ISHELL_CreateInstance被调用的位置)。 This program is a tool that...
本程序是一个在模拟器上定位BREW应用程序内存泄露位置的工具,可以给出内存泄露位置的调用栈信息(包括MALLOC/REALLOC被调用的位置,也能定位到ISHELL_CreateInstance被调用的位置)。 This program is a tool that...
非标准头文件 alloc.h ,主要是区别malloc.h 两个头文件的区别,查看其而这区别 非标准头文件 alloc.h ,主要是区别malloc.h 两个头文件的区别,查看其而这区别
test-fake:与fake-malloc.c链接的 test-malloc 版本 test-malloc-eg:测试程序的 GNU/Linux x86_64 可执行版本 运行测试文件的示例 下面给出了一个执行示例: $ test-malloc 10 100 ********** *** INITIAL # all...
学生用来实现自己的malloc, realloc和free函数。 Students implement their own versions of malloc, free, and realloc. This lab gives students a clear understanding of data layout and organization, and ...
malloc和calloc区别 函数malloc()和calloc()都可以用来动态分配内存空间,但两者稍有区别。 malloc()函数有一个参数,即要分配的内存空间的大小: void *malloc(size_t size); calloc()函数有两个参数,分别为元素...