realloc,malloc,calloc的区别

本文介绍了C语言中的四个标准内存管理函数:malloc、calloc、realloc和free。详细解释了这些函数的作用、参数及使用方法,并通过实例说明了如何利用这些函数进行内存分配与释放。

转载自:http://www.cnblogs.com/BlueTzar/articles/1136549.html,感谢作者。

三个函数的申明分别是: 
void* realloc(void* ptr, unsigned newsize); 
void* malloc(unsigned size); 
void* calloc(size_t numElements, size_t sizeOfElement); 
都在stdlib.h函数库内

它们的返回值都是请求系统分配的地址,如果请求失败就返回NULL 

malloc用于申请一段新的地址,参数size为需要内存空间的长度,如: 
char* p; 
p=(char*)malloc(20);

calloc与malloc相似,参数sizeOfElement为申请地址的单位元素长度,numElements为元素个数,如: 
char* p; 
p=(char*)calloc(20,sizeof(char)); 
这个例子与上一个效果相同

realloc是给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,newsize是重新申请的地址长度 
如: 
char* p; 
p=(char*)malloc(sizeof(char)*20); 
p=(char*)realloc(p,sizeof(char)*40);

注意,这里的空间长度都是以字节为单位。 


C语言的标准内存分配函数:malloc,calloc,realloc,free等。 
malloc与calloc的区别为1块与n块的区别: 
malloc调用形式为(类型*)malloc(size):在内存的动态存储区中分配一块长度为“size”字节的连续区域,返回该区域的首地址。 
calloc调用形式为(类型*)calloc(n,size):在内存的动态存储区中分配n块长度为“size”字节的连续区域,返回首地址。 
realloc调用形式为(类型*)realloc(*ptr,size):将ptr内存大小增大到size。 


free的调用形式为free(void*ptr):释放ptr所指向的一块内存空间。 
C++中为new/delete函数。


### `malloc`、`realloc`、`calloc` 的区别 #### 内存分配与初始化 `malloc` 用于在堆上分配一块连续的、指定大小的内存块,返回一个 `void*` 类型的指针。它不会对分配的内存进行初始化,因此内存中可能包含任意数据 [^1]。 `calloc` 与 `malloc` 类似,也用于分配内存,但其接受两个参数:元素个数每个元素的大小。分配内存后,`calloc` 会自动将内存初始化为 0,适用于需要清零的场景 [^2]。 `realloc` 用于调整之前通过 `malloc`、`calloc` 或 `realloc` 分配的内存块的大小。它可以扩大或缩小内存块,并返回新的内存块指针。如果内存块被扩展,新增部分的内容是未初始化的 [^3]。 #### 参数差异 - `malloc` 接受一个参数,即需要分配的字节数。 - `calloc` 接受两个参数:元素个数每个元素的大小。 - `realloc` 接受两个参数:指向已分配内存的指针新的内存大小 [^4]。 #### 使用场景 - `malloc` 适用于需要分配内存但不需要初始化的场景,例如动态数组或数据结构的构建。 - `calloc` 适用于需要分配并初始化为 0 的场景,特别是在分配数组或结构体时,可以避免手动初始化的繁琐操作。 - `realloc` 适用于需要调整已分配内存大小的场景,例如动态扩容数组或处理变长数据结构 [^1]。 #### 内存管理 无论使用 `malloc`、`calloc` 还是 `realloc` 分配的内存,都需要在使用完毕后通过 `free` 函数释放,否则会导致内存泄漏。内存泄漏会消耗系统资源,影响程序性能,甚至导致程序崩溃 [^3]。 #### 示例代码 ```c #include <stdio.h> #include <stdlib.h> int main() { int *ptr; // 使用 malloc 分配内存 ptr = (int*)malloc(2 * sizeof(int)); if (ptr == NULL) { printf("内存分配失败\n"); return 1; } // 初始化内存 for (int i = 0; i < 2; i++) { ptr[i] = i; } // 使用 realloc 扩展内存 ptr = (int*)realloc(ptr, 4 * sizeof(int)); if (ptr == NULL) { printf("内存重新分配失败\n"); return 1; } // 继续使用扩展的内存 for (int i = 2; i < 4; i++) { ptr[i] = i; } // 打印结果 for (int i = 0; i < 4; i++) { printf("%d ", ptr[i]); } printf("\n"); // 释放内存 free(ptr); return 0; } ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值