📜  malloc 和 calloc 和 reallo 的区别 - C 编程语言(1)

📅  最后修改于: 2023-12-03 14:44:08.169000             🧑  作者: Mango

Malloc 和 calloc 和 realloc 的区别

在 C 语言中,malloc、calloc 和 realloc 都可以用来动态地分配内存空间。这三个函数的作用略有不同,本文将从以下方面进行介绍:

  1. 分配内存的方法
  2. 内存初始化
  3. 内存大小的调整
1. 分配内存的方法
malloc
void* malloc(size_t size);

malloc 可以用来分配指定大小的内存空间,返回值是一个指向所分配内存的指针。如果无法分配指定大小的内存空间,则返回 NULL

例如:

int* p = (int*)malloc(sizeof(int) * 10); // 分配了可存储 10 个 int 类型变量的内存空间
calloc
void* calloc(size_t n, size_t size);

calloc 可以用来分配 n 个指定大小的内存空间,返回值是一个指向所分配内存的指针。如果无法分配指定大小的内存空间,则返回 NULL

注意:calloc 分配的内存空间会被初始化为 0。

例如:

int* p = (int*)calloc(10, sizeof(int)); // 分配了可存储 10 个 int 类型变量的内存空间,并自动初始化为 0
realloc
void* realloc(void* ptr, size_t size);

realloc 可以用来重新分配已有内存的大小,返回值是一个指向所重新分配的内存的指针。如果无法完成内存大小的调整,则返回 NULL

注意:

  • 如果 ptrNULL,则 realloc 的效果与 malloc 相同。
  • 如果 size 大于已有内存的大小,则会进行扩展;如果 size 小于已有内存的大小,则会进行缩小;如果 size 等于已有内存的大小,则不会进行任何操作,直接返回原始内存的指针。

例如:

int* p = (int*)malloc(sizeof(int) * 10); // 分配了可存储 10 个 int 类型变量的内存空间
p = (int*)realloc(p, sizeof(int) * 20); // 扩展内存空间,可存储 20 个 int 类型变量
2. 内存初始化
malloc

malloc 分配的内存空间未被初始化,即里面存储的是随机值,因此需要使用其他方式进行内存初始化。

例如:

int* p = (int*)malloc(sizeof(int) * 10); // 分配了可存储 10 个 int 类型变量的内存空间
for (int i = 0; i < 10; i++) {
    p[i] = 0; // 手动将内存空间初始化为 0
}
calloc

calloc 分配的内存空间会被初始化为 0,因此不需要进行额外的内存初始化。

例如:

int* p = (int*)calloc(10, sizeof(int)); // 分配了可存储 10 个 int 类型变量的内存空间,并自动初始化为 0
3. 内存大小的调整
malloc

malloc 分配的内存空间大小是固定的,无法进行内存大小的调整。

calloc

calloc 分配的内存空间大小是固定的,无法进行内存大小的调整。

realloc

realloc 可以用来重新分配已有内存的大小,因此可以进行内存大小的调整。

例如:

int* p = (int*)malloc(sizeof(int) * 10); // 分配了可存储 10 个 int 类型变量的内存空间
p = (int*)realloc(p, sizeof(int) * 20); // 扩展内存空间,可存储 20 个 int 类型变量