malloc()和calloc()之间的区别与代码示例

2021年3月16日12:43:31 发表评论 757 次浏览

先决条件: 使用malloc(), calloc(), free()和realloc()在C中进行动态内存分配

名字分配和calloc()是动态分配内存的库函数。这意味着在运行时(程序执行)期间从堆段中分配了内存。

初始化

malloc()分配给定大小(以字节为单位)的内存块, 并返回一个指向该块开头的指针。 malloc()不会初始化分配的内存。如果我们尝试在初始化之前访问内存块的内容, 则会遇到分段错误错误(或可能是垃圾值)。

void * malloc ( size_t size);

calloc()分配内存, 还将分配的内存块初始化为零。如果我们尝试访问这些块的内容, 则将获得0。

void * calloc ( size_t num, size_t size);

参数数量:

与malloc()不同, calloc()接受两个参数:

1)要分配的块数。

2)每个块的大小。

返回值:在malloc()和calloc()中成功分配后, 将返回指向内存块的指针, 否则返回NULL值, 指示分配失败。

例如, 如果我们要为5个整数的数组分配内存, 请参见以下程序:

// C program to demonstrate the use of calloc()
// and malloc()
#include <stdio.h>
#include <stdlib.h>
  
int main()
{
     int * arr;
  
     // malloc() allocate the memory for 5 integers
     // containing garbage values
     arr = ( int *) malloc (5 * sizeof ( int )); // 5*4bytes = 20 bytes
  
     // Deallocates memory previously allocated by malloc() function
     free (arr);
  
     // calloc() allocate the memory for 5 integers and
     // set 0 to all of them
     arr = ( int *) calloc (5, sizeof ( int ));
  
     // Deallocates memory previously allocated by calloc() function
     free (arr);
  
     return (0);
}

通过使用malloc()和memset(), 我们可以实现与calloc()相同的功能,

ptr = malloc (size);
memset (ptr, 0, size);

注意:最好使用malloc而不是calloc, 除非我们想要零初始化, 因为malloc比calloc快。因此, 如果我们只想复制某些东西或执行不需要用零填充的块, 那么malloc是一个更好的选择。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: