C语言-内存相关函数:malloc、free、calloc、realloc 作者:马育民 • 2022-05-03 22:24 • 阅读:10212 # 添加头 需要添加头信息 ``` #include ``` # malloc C语言提供了一个动态内存开辟的函数,在stdlib.h 头文件中。函数原型如下: ``` void* malloc (size_t size); ``` 这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。size -- 内存块的大小,以字节为单位, 1. 此函数的返回值是分配区域的起始地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置。如果分配成功则返回指向被分配内存的指针),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。 2. 如果参数size 为0,malloc的行为是标准是未定义的,取决于编译器。 # free 对应malloc,C语言提供了另外一个函数free,专门是用来做动态内存的释放和回收的,在stdlib.h 头文件中。函数原型如下: ``` void free (void* ptr); ``` free函数用来释放动态开辟的内存。如果参数ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。如果参数ptr 是NULL指针,则函数什么事都不做。释放ptr后要将ptr及时指向NULL指针。 ### 例子 ``` void TEST1() { int num = 0; scanf("%d",&num); int* ptr = NULL; ptr = (int*)malloc(num * sizeof(int)); if (ptr != NULL) { int i = 0; for (i = 0; i < num; i++) { *(ptr + i) = 0; } } free(ptr); ptr = 0; } ``` # calloc C语言还提供了一个函数叫calloc , calloc 函数也用来动态内存分配。malloc 和 calloc 之间的不同点是,malloc 不会设置内存为零,而 calloc 会设置分配的内存为零。num -- 要被分配的元素个数,size -- 元素的大小,原型如下: ``` void* calloc (size_t num, size_t size); ``` 函数的功能是为num个大小为size的元素开辟一块空间,并且把空间的每个字节初始化为0。与函数malloc 的区别只在于calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。 ### 例子 ``` void TEST2() { int* p = NULL; p = (int*)calloc(10, sizeof(int)); if (p != NULL) { //使用空间 } free(p); p = 0; } ``` # realloc 重新调整之前调用 malloc 或 calloc 所分配的 ptr 所指向的内存块的大小。 **应用场景:**内存不够时,可通过该函数扩展、缩小内存 **提示:** 比 `malloc()` + `memset()` 函数 执行效率更高 ``` void* realloc (void* ptr, size_t size); ``` ### 例子 ``` void TEST3() { int* p = NULL; p = (int*)malloc(100); if (p != NULL) { //使用空间 } else { exit(EXIT_FAILURE); } int* ptr = NULL; ptr = (int *)realloc(p,100); if (ptr != NULL) { p = ptr; //指针要还给p } free(p); p = NULL; } ``` 感谢: https://blog.csdn.net/RMA515T/article/details/115251035 原文出处:http://malaoshi.top/show_1IX3FIywzFUd.html