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


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

malloccalloc的区别为1块与n块的区别: 
malloc
调用形式为(类型*)malloc(size):在内存的动态存储区中分配一块长度为“size”字节的连续区域,返回该区域的首地址。 
calloc
调用形式为(类型*)calloc(nsize):在内存的动态存储区中分配n块长度为“size”字节的连续区域,返回首地址。 
realloc
调用形式为(类型*)realloc(*ptrsize):将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原先所指向的内存地址丢失。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值