动态内存分配是在程序运行时分配内存空间的技术,可以根据需要动态地分配和释放内存。在C语言中,动态内存分配的函数主要有malloc、calloc、realloc和free。

  1. malloc函数 malloc函数用于在堆内存中分配指定大小的连续内存空间,并返回该内存空间的起始地址。其函数原型为:
void* malloc(size_t size);

其中,size是要分配的内存空间的大小,单位为字节。malloc函数返回一个void类型的指针,需要将其转换为所需的类型后使用。如果分配成功,则返回指向分配的内存空间的指针;如果分配失败,则返回NULL。

示例:

int* p;
p = (int*)malloc(5 * sizeof(int)); // 分配5个int类型的空间
if (p != NULL) {
    // 分配成功
} else {
    // 分配失败
}
  1. calloc函数 calloc函数用于在堆内存中分配指定数量和大小的连续内存空间,并将分配的空间初始化为0。其函数原型为:
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 {
    // 分配失败
}
  1. realloc函数 realloc函数用于更改已分配内存空间的大小,并返回修改后的内存空间的起始地址。其函数原型为:
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 {
    // 分配失败
}
  1. free函数 free函数用于释放动态分配的内存空间,将其归还给系统。其函数原型为:
void free(void* ptr);

其中,ptr是指向要释放的内存空间的指针。调用free函数后,该指针所指向的内存空间将被释放,可以重新用于其他用途。

示例:

int* p;
p = (int*)malloc(5 * sizeof(int)); // 分配5个int类型的空间
if (p != NULL) {
    // 分配成功
    free(p); // 释放内存空间
} else {
    // 分配失败
}

在使用动态内存分配函数时,需要注意以下几点:

  1. 使用完内存空间后一定要及时释放,避免内存泄漏。
  2. 分配内存空间前要检查分配是否成功,即判断返回的指针是否为NULL。
  3. 在使用realloc函数时,一定要保存返回的指针,以防重新分配导致原指针失效。
  4. 动态内存分配是一种低层次的