在C语言中,malloc
、calloc
、realloc
和 free
是用于动态内存管理的标准库函数,它们定义在 <stdlib.h>
头文件中。以下是这些函数的用法:
1. malloc
malloc
函数用于在堆区分配指定大小的内存块。
- 原型:
void* malloc(size_t size);
- 参数:
size
:需要分配的内存字节数。
- 返回值:
- 成功时,返回指向分配内存的指针。
- 失败时,返回
NULL
。
- 用法:
int* ptr = (int*)malloc(10 * sizeof(int)); // 分配10个整数的空间 if (ptr == NULL) { // 分配失败,处理错误 }
2. calloc
calloc
函数用于在堆区分配指定数量的内存块,并将每个内存块初始化为0。
- 原型:
void* calloc(size_t num, size_t size);
- 参数:
num
:需要分配的内存块数量。size
:每个内存块的大小。
- 返回值:
- 成功时,返回指向分配内存的指针。
- 失败时,返回
NULL
。
- 用法:
int* ptr = (int*)calloc(10, sizeof(int)); // 分配10个整数并初始化为0 if (ptr == NULL) { // 分配失败,处理错误 }
3. realloc
realloc
函数用于调整之前由 malloc
、calloc
或 realloc
分配的内存块的大小。
- 原型:
void* realloc(void* ptr, size_t size);
- 参数:
ptr
:指向之前分配的内存块的指针。size
:新的内存块大小。
- 返回值:
- 成功时,返回指向新分配内存的指针。
- 失败时,返回
NULL
。原内存块不会被释放,需要手动释放。
- 用法:
int* ptr = (int*)malloc(10 * sizeof(int)); // ... 使用 ptr ... ptr = (int*)realloc(ptr, 20 * sizeof(int)); // 增加ptr指向的内存块大小到20个整数 if (ptr == NULL) { // 重新分配失败,处理错误 }
4. free
free
函数用于释放之前由 malloc
、calloc
或 realloc
分配的内存块。
- 原型:
void free(void* ptr);
- 参数:
ptr
:指向需要释放的内存块的指针。
- 返回值:
- 无返回值。
- 用法:
int* ptr = (int*)malloc(10 * sizeof(int)); // ... 使用 ptr ... free(ptr); // 释放ptr指向的内存块 ptr = NULL; // 避免野指针
在使用这些函数时,需要注意以下几点:
- 使用
malloc
、calloc
或realloc
分配内存后,应该检查返回的指针是否为NULL
,以处理内存分配失败的情况。 - 释放内存后,应该将指针设置为
NULL
,以避免产生野指针。 - 调用
realloc
时,如果新的大小小于原大小,原内存块的内容可能会丢失。如果新的大小大于原大小,新分配的内存部分不会被初始化。