动态内存分配是在程序运行时分配内存空间的技术,可以根据需要动态地分配和释放内存。在C语言中,动态内存分配的函数主要有malloc、calloc、realloc和free。
void* malloc(size_t size);
其中,size是要分配的内存空间的大小,单位为字节。malloc函数返回一个void类型的指针,需要将其转换为所需的类型后使用。如果分配成功,则返回指向分配的内存空间的指针;如果分配失败,则返回NULL。
示例:
int* p;
p = (int*)malloc(5 * sizeof(int)); // 分配5个int类型的空间
if (p != NULL) {
// 分配成功
} else {
// 分配失败
}
void* calloc(size_t num, size_t size);
其中,num是要分配的元素数量,size是每个元素的大小,单位为字节。calloc函数返回一个void类型的指针,需要将其转换为所需的类型后使用。如果分配成功,则返回指向分配的内存空间的指针;如果分配失败,则返回NULL。
示例:
int* p;
p = (int*)calloc(5, sizeof(int)); // 分配5个int类型的空间,并初始化为0
if (p != NULL) {
// 分配成功
} else {
// 分配失败
}
void* realloc(void* ptr, size_t size);
其中,ptr是指向已分配内存空间的指针,size是新的内存空间的大小,单位为字节。realloc函数返回一个void类型的指针,需要将其转换为所需的类型后使用。如果分配成功,则返回指向修改后的内存空间的指针;如果分配失败,则返回NULL。注意,realloc函数可能会在原地扩展内存,也可能会重新分配新的内存空间,因此需要注意保存返回的指针。
示例:
int* p;
p = (int*)malloc(5 * sizeof(int)); // 分配5个int类型的空间
p = (int*)realloc(p, 10 * sizeof(int)); // 将原来的空间扩展为10个int类型的空间
if (p != NULL) {
// 分配成功
} else {
// 分配失败
}
void free(void* ptr);
其中,ptr是指向要释放的内存空间的指针。调用free函数后,该指针所指向的内存空间将被释放,可以重新用于其他用途。
示例:
int* p;
p = (int*)malloc(5 * sizeof(int)); // 分配5个int类型的空间
if (p != NULL) {
// 分配成功
free(p); // 释放内存空间
} else {
// 分配失败
}
在使用动态内存分配函数时,需要注意以下几点: