📅  最后修改于: 2023-12-03 14:44:08.169000             🧑  作者: Mango
在 C 语言中,malloc、calloc 和 realloc 都可以用来动态地分配内存空间。这三个函数的作用略有不同,本文将从以下方面进行介绍:
void* malloc(size_t size);
malloc
可以用来分配指定大小的内存空间,返回值是一个指向所分配内存的指针。如果无法分配指定大小的内存空间,则返回 NULL
。
例如:
int* p = (int*)malloc(sizeof(int) * 10); // 分配了可存储 10 个 int 类型变量的内存空间
void* calloc(size_t n, size_t size);
calloc
可以用来分配 n 个指定大小的内存空间,返回值是一个指向所分配内存的指针。如果无法分配指定大小的内存空间,则返回 NULL
。
注意:calloc
分配的内存空间会被初始化为 0。
例如:
int* p = (int*)calloc(10, sizeof(int)); // 分配了可存储 10 个 int 类型变量的内存空间,并自动初始化为 0
void* realloc(void* ptr, size_t size);
realloc
可以用来重新分配已有内存的大小,返回值是一个指向所重新分配的内存的指针。如果无法完成内存大小的调整,则返回 NULL
。
注意:
ptr
为 NULL
,则 realloc
的效果与 malloc
相同。size
大于已有内存的大小,则会进行扩展;如果 size
小于已有内存的大小,则会进行缩小;如果 size
等于已有内存的大小,则不会进行任何操作,直接返回原始内存的指针。例如:
int* p = (int*)malloc(sizeof(int) * 10); // 分配了可存储 10 个 int 类型变量的内存空间
p = (int*)realloc(p, sizeof(int) * 20); // 扩展内存空间,可存储 20 个 int 类型变量
malloc
分配的内存空间未被初始化,即里面存储的是随机值,因此需要使用其他方式进行内存初始化。
例如:
int* p = (int*)malloc(sizeof(int) * 10); // 分配了可存储 10 个 int 类型变量的内存空间
for (int i = 0; i < 10; i++) {
p[i] = 0; // 手动将内存空间初始化为 0
}
calloc
分配的内存空间会被初始化为 0,因此不需要进行额外的内存初始化。
例如:
int* p = (int*)calloc(10, sizeof(int)); // 分配了可存储 10 个 int 类型变量的内存空间,并自动初始化为 0
malloc
分配的内存空间大小是固定的,无法进行内存大小的调整。
calloc
分配的内存空间大小是固定的,无法进行内存大小的调整。
realloc
可以用来重新分配已有内存的大小,因此可以进行内存大小的调整。
例如:
int* p = (int*)malloc(sizeof(int) * 10); // 分配了可存储 10 个 int 类型变量的内存空间
p = (int*)realloc(p, sizeof(int) * 20); // 扩展内存空间,可存储 20 个 int 类型变量