malloc() 和 calloc() 之间的区别
malloc() 与 calloc() 的主要区别
- malloc() 函数只返回起始地址,并且不会将其置零,而 calloc() 函数返回起始地址并将其置零。
- malloc 函数的参数数量为 1,而 calloc 函数的参数数量为 2。
- malloc() 的时间效率高于 calloc(),而 malloc() 不如 calloc() 安全。
- malloc 不初始化内存,而 calloc 执行内存初始化。

什么是动态内存分配?
动态内存分配是在运行时分配内存的过程。有四个库函数,calloc()、free()、realloc() 和 malloc(),它们可以在程序执行期间用于分配和释放内存。这些函数定义在名为 stdlib.h 的头文件中。
什么是 malloc()?
这是一个用于动态分配内存块的函数。它保留指定大小的内存空间,并返回指向内存位置的空指针。
返回的指针通常是 void 类型。这意味着我们可以将 malloc 函数赋给任何指针。malloc 的完整形式是 memory allocation(内存分配)。
什么是 calloc()?
Calloc() 函数用于分配多个内存块。它是一个动态内存分配函数,用于为数组和结构等复杂数据结构分配内存。如果此函数未能分配足够的指定空间,它将返回空指针。calloc 函数的完整形式是 contiguous allocation(连续分配)。
malloc() 和 calloc() 之间的区别
malloc() vs calloc() 的重要区别如下:
malloc() | calloc() |
---|---|
Malloc() 函数将创建用户指定的单块内存。 | Calloc() 函数可以为变量分配多个内存块。 |
Malloc 函数包含垃圾值。 | calloc 函数分配的内存块始终初始化为零。 |
参数数量为 1。 | 参数数量为 2。 |
Calloc 比 malloc 慢。 | Malloc 比 calloc 快。 |
与 calloc 相比,它不安全。 | 与 malloc 相比,它更安全。 |
时间效率高于 calloc()。 | 时间效率低于 malloc()。 |
Malloc() 函数只返回起始地址,并且不将其置零。 | 在分配地址之前,Calloc() 函数返回起始地址并将其置零。 |
它不执行内存初始化。 | 它执行内存初始化。 |
malloc() 的语法
malloc() 的语法如下:
ptr = (cast_type *) malloc (byte_size);
在上例语法中,ptr 是一个 cast_type 指针。malloc 函数返回一个指向 byte_size 已分配内存的指针。
Example: ptr = (int *) malloc (50)
成功执行此语句后,将保留 50 字节的内存空间。已保留空间第一个字节的地址被赋给 int 类型的指针“ptr”。
calloc() 的语法
malloc() 的语法如下:
ptr = (cast_type *) calloc (n, size);
上述语法用于分配 n 个相同大小的内存块。在分配内存空间后,所有字节都初始化为零。将返回指向已分配内存空间第一个字节的指针。
C 语言中 malloc() 的示例
在下面的代码中,sizeof(*ptr) 用于分配 15 个整数的内存块。在 printf 语句中,我们查找第 6 个整数的值。
#include<stdlib.h> #include<stdio.h> int main(){ int *ptr; ptr = malloc(15 * sizeof(*ptr)); if (ptr != NULL) { *(ptr + 5) = 480; printf("Value of the 6th integer is %d",*(ptr + 5)); } }
输出
第 6 个整数的值是 480
C 语言中 calloc() 的示例
下面的 C 语言程序计算前十项的和。如果指针值为 null,则内存空间将不会被分配。
for 循环用于迭代变量“i”的值并打印总和。最后,使用 free 函数释放指针。
#include <stdio.h> #include <stdlib.h> int main() { int i, * ptr, sum = 0; ptr = calloc(10, sizeof(int)); if (ptr == NULL) { printf("Error! memory not allocated."); exit(0); } printf("Building and calculating the sequence sum of the first 10 terms \n"); for (i = 0; i < 10; ++i) { * (ptr + i) = i; sum += * (ptr + i); } printf("Sum = %d", sum); free(ptr); return 0; }
输出
构建并计算前 10 项的序列和 n 总和 = 45
为什么使用 malloc()?
使用 malloc() 的原因如下:
- 当您需要在运行时分配内存时,应使用 malloc()。
- 当您需要分配必须存在于当前内存块执行完成之后的对象时,应使用 malloc。
- 如果您需要分配大于栈大小的内存,请选择 malloc()。
- 它返回指向已分配空间第一个字节的指针。
- 它使开发人员能够按需分配所需的确切内存量。
- 此函数从堆中分配指定字节数的内存块。
为什么使用 calloc()?
使用 calloc() 的原因如下:
- 当您需要将已分配的内存设置为零时。
- 您可以使用 calloc 返回一个指针来访问内存堆。
- 当您需要将元素初始化为零以返回指向内存的指针时使用。
- 防止 malloc() 可能发生的溢出
- 使用 calloc() 请求一个已知已清零的页面。