malloc()与calloc():用示例说明关键区别

发布于:2021-02-09 09:40:20

0

409

0

malloc() calloc() 区别 示例

在学习malloc和calloc之间的区别之前,让我们先学习:

什么是动态内存分配?

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

什么是malloc()?

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

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

什么是calloc()?

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

为什么要使用malloc()?

下面是使用malloc()的原因:

  • 当您必须在运行时分配内存时,应使用malloc()。

  • 当您必须分配在当前内存块执行之后必须存在的对象时,应使用malloc。

  • 如果您需要分配的内存大于该堆栈的大小,请使用malloc()。

  • 它将指针返回到分配空间的第一个字节。

  • 它使开发人员可以按需要分配确切数量的内存。

  • 该函数从堆中分配字节的内存块大小。

为什么要使用calloc()?

下面是使用calloc()的原因:

  • 当您必须将分配的内存设置为零时。

  • 您可以使用calloc返回一个指针来访问内存堆。

  • 需要将元素初始化为零以返回指向内存的指针时使用。

  • 为了防止malloc()可能发生的溢出

  • 使用calloc()请求已知已归零的页面。

malloc()的语法

下面是malloc()的语法

ptr = (cast_type *) malloc (byte_size);

在上述语法中,ptr是cast类型的指针。malloc函数返回一个指向字节大小的分配内存的指针。

ptr = (int *) malloc (50)

当此语句成功执行时,将保留50字节的内存空间。保留空间的第一个字节的地址分配给int类型的指针“ptr”。

calloc()的语法

下面是malloc()的语法

ptr = (cast_type *) calloc (n, size);

上面的语法用于分配相同大小的n个内存块。分配内存空间后,所有字节都初始化为零。返回当前位于分配内存空间的第一个字节的指针。

C中的malloc()示例

在下面的代码中,sizeof(*ptr)用于分配一个包含15个整数的内存块。在printf语句中,我们找到了第6个整数的值。

#include#includeint 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#includeint 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。

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

 

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

{xunruicms_img_title}

关键区别: 

  • malloc()函数只返回起始地址,不将其置零另一方面,calloc()函数返回起始地址并将其置零。

  • 在malloc函数中,参数数为2,而在calloc函数中,参数数为1。

  • malloc()时间效率高于calloc(),而malloc()与calloc()相比不安全。

  • malloc不初始化内存,而calloc执行内存初始化。