malloc
、
calloc
和
realloc
。
malloc
用于分配指定字节数的内存;
calloc
用于分配指定数量的元素,并初始化为0;
realloc
用于调整已分配内存的大小。
在C语言中,申请内存的API主要有几个核心函数:malloc
、calloc
、realloc
和free
,这些函数是C标准库中的一部分,用于动态内存管理,它们允许程序在运行时根据需要分配和释放内存空间。
malloc
(memory allocation)是C语言中最常用的内存申请函数,用于在堆区分配指定大小的内存块。
void malloc(size_t size);
size
:要分配的内存大小,以字节为单位。
成功时,返回一个指向分配内存块的指针。
失败时,返回NULL
。
int ptr; int n = 5; ptr = (int)malloc(n sizeof(int)); if (ptr == NULL) { // 处理内存分配失败的情况 }
malloc
只负责分配内存,不初始化内存内容。
使用完通过malloc
分配的内存后,应使用free
函数释放,以避免内存泄漏。
calloc
(clear allocation)与malloc
相似,但在分配内存的同时将其初始化为0。
void calloc(size_t num, size_t size);
num
:要分配的元素数量。
size
:每个元素的大小,以字节为单位。
成功时,返回一个指向分配并初始化为0的内存块的指针。
失败时,返回NULL
。
int ptr; int n = 5; ptr = (int)calloc(n, sizeof(int)); if (ptr == NULL) { // 处理内存分配失败的情况 }
calloc
分配的内存已经初始化为0,因此可以直接使用,无需额外初始化。
同样,使用完通过calloc
分配的内存后,应使用free
函数释放。
realloc
(re-allocation)用于重新分配已经分配的内存空间大小,可以调整已分配内存的大小。
void realloc(void ptr, size_t size);
ptr
:指向已分配内存块的指针。
size
:新的内存大小,以字节为单位。
成功时,返回一个指向新分配内存块的指针,可能与原指针相同或不同。
失败时,返回NULL
,原内存块保持不变。
int ptr; int n = 5; ptr = (int)malloc(n sizeof(int)); if (ptr == NULL) { // 处理内存分配失败的情况 } // 假设需要更大的内存空间 int newSize = 10; ptr = (int)realloc(ptr, newSize sizeof(int)); if (ptr == NULL) { // 处理内存重新分配失败的情况 free(ptr); // 释放原内存块 }
使用realloc
时,如果新大小小于原大小,多余部分的数据可能会丢失。
如果realloc
失败,原内存块保持不变,但应避免继续使用原指针,以免造成未定义行为。
同样,使用完通过realloc
分配的内存后,应使用free
函数释放。
free
用于释放先前通过malloc
、calloc
或realloc
函数分配的内存空间。
void free(void ptr);
ptr
:指向要释放的内存块的指针。
free(ptr); // 释放之前分配的内存 ptr = NULL; // 避免野指针
只能释放通过上述函数分配的内存。
释放未初始化或不属于堆区的内存会导致未定义行为。
释放后将指针设置为NULL
,以避免野指针问题。
在C语言中,申请内存的API主要包括malloc
、calloc
、realloc
和free
,这些函数提供了灵活的内存管理方式,允许程序在运行时根据需要动态分配和释放内存,正确使用这些函数对于避免内存泄漏、提高程序性能和稳定性至关重要,在实际编程中,应根据具体需求选择合适的内存申请函数,并在使用完毕后及时释放内存。