
这三个函数的声明是:
void *重新分配(void * ptr,未签名的newsize);
void * malloc(无符号大小);
void * calloc(size_t numElements,size_t sizeOfElement);
所有内容都在stdlib.h库中. 它们的返回值是请求系统分配的地址. 如果请求失败,则返回NULL.

malloc和calloc的区别是1个块和n个块之间的区别:
malloc调用的格式为(类型*)malloc(大小): 在内存的动态存储区域中分配一个长度为“ size”的连续区域,并返回该区域的第一个地址.
calloc调用形式为(type *)calloc(n,size): 在内存的动态存储区域中分配n个“大小”字节的块,并返回第一个地址.
realloc调用的形式是(type *)realloc(* ptr,size): 将ptr内存大小增加到size. (它也可以减少,减少的内容消失).
另一个不能直接看到的区别是malloc仅分配内存,而不能初始化获取的内存,因此新内存的值将是随机的. 动态分配内存后,Calloc会自动将此内存空间初始化为零.

重新分配要注意的一个细节:
无非就是扩展现有内存.
char * p = malloc(1024);
char * q =重新分配(p,2048);
if(p!= q){

免费(p);
}
现在的问题是我们应该如何处理指针p. 一开始,根据我最直观的理解,如果只是p = NULL;. 最后,仅需要释放q的空间.
因为我最近正在打包. 在单元测试期间发现了结果. 有时当我使用free(q);时会出错. 所以我很沮丧.
稍后,在仔细跟踪之后,我发现重新分配完成后,q和p的指针地址相同. 但有时会有所不同.

仔细检查信息. 我得到以下信息:
1. 如果当前的连续内存块足以进行重新分配,则只需扩展p指向的空间并返回p的指针地址即可. 此时,q和p指向相同的地址.
2. 如果当前的连续内存块不够长malloc realloc calloc,请找到另一个足够长的位置,分配一块新的内存q,然后将p指向的内容复制到q,然后返回q. 并删除p指向的内存空间.
这意味着realloc有时会生成一个新的内存地址malloc realloc calloc,有时却不会. 这样分配完成之后. 我们需要确定p是否等于q. 并进行相应处理.
这里需要注意的一点是避免p = realloc(p,2048);重新分配分配失败后,这可能导致p指向的内存地址丢失.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-150398-1.html