您的位置:首页 > 其它

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

2017-01-12 21:28 176 查看
三个函数的申明分别是: 

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);
现在的问题是我们应该如何处理指针 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原先所指向的内存地址丢失。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: