malloc() 和 calloc() 之间的区别

malloc() 与 calloc() 之间的主要区别

  • malloc() 函数仅返回起始地址并且不会将其设为零,另一方面,calloc() 函数返回起始地址并将其设为零。
  • malloc函数中参数个数为1,而calloc函数中参数个数为2。
  • malloc() 的时间效率高于 calloc(),但是 malloc() 与 calloc() 相比并不安全。
  • malloc 不初始化内存,而 calloc 执行内存初始化。
malloc() 与 calloc()
malloc() 与 calloc()

什么是动态内存分配?

动态内存分配 是在运行时分配内存的过程。有四个库例程,calloc()、free()、 重新分配()以及 malloc(),它们可用于在程序执行期间分配和释放内存。这些例程在名为 stdlib.h 的头文件中定义。

什么是 malloc()?

它是一个用于动态分配内存块的函数。它保留指定大小的内存空间并返回指向该内存位置的空指针。

返回的指针通常为 void 类型。这意味着我们可以将 malloc 函数分配给任何指针。malloc 的全称是内存分配。

什么是 calloc() ?

Calloc() 函数 用于分配多个内存块。它是一个动态内存分配函数,用于将内存分配给复杂的数据结构,例如数组和结构。如果此函数未能按指定分配足够的空间,则返回空指针。calloc 函数的完整形式是连续分配。

malloc() 和 calloc() 之间的区别

以下是 malloc() 和 calloc() 之间的重要区别:

malloc() 调用()
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语言程序计算前十项的和。如果指针值为空,则不会分配内存空间。

使用 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 Sum = 45

为什么要使用 malloc()?

以下是使用 malloc() 的原因

  • 当您必须在运行时分配内存时,应该使用 malloc()。
  • 当您必须分配必须存在于当前内存块执行之外的对象时,您应该使用 malloc。
  • 如果需要分配大于该堆栈大小的内存,请选择 malloc()。
  • 它返回指向分配空间的第一个字节的指针。
  • 它使开发人员能够根据需要分配精确数量的内存。
  • 该函数从堆中分配一个字节大小的内存块。

为什么要使用 calloc() ?

以下是使用 calloc() 的原因

  • 当您必须将分配的内存设置为零时。
  • 您可以使用返回指针的 calloc 来访问内存堆。
  • 当您需要将元素初始化为零以返回指向内存的指针时使用。
  • 防止 malloc() 可能造成的溢出
  • 使用 calloc() 请求已知已清零的页面。