malloc()和calloc()之间的区别是什么?

3
有人能解释一下在C语言中使用malloc()calloc()进行动态内存分配的区别吗?



2
在零时,另一个不会。 - cnicutar
6个回答

5
尝试以下操作:使用malloc分配一些内存,例如
char* pszKuchBhi ;
pszKuchBhi = malloc(10) ;
printf( "%s\n", pszKuchBhi ) ;  
// Will give some junk values as the memory allocated is not initialized and 
// was storing some garbage values

现在,将malloc替换为calloc并进行相同的操作。看看有什么不同之处。

char* pszKuchBhi ;
pszKuchBhi = calloc( 10, 1 ) ;
printf( "%s\n", pszKuchBhi ) ; 
//Will print nothing as the memory is initialized to 0

calloc分配的内存会被初始化为0。 对于初学者来说,初始化内存是很好的,但从性能角度来看,calloc速度较慢,因为它必须分配然后初始化。 为了更好地解释,你可以随时通过谷歌搜索同样的问题,但最好自己体验一下,看一看内部情况。你也可以注意你的内存,以便亲眼看到。


0

分配100字节的内存,其初始化为0。

char *ptr = calloc(100, sizeof(char));

如果我们使用malloc(),那么
char *ptr = malloc(100);
int i = 0;
for(i=0; i< 100; i++)
    ptr[i] = 0;

在分配内存后,如果需要初始化,最好使用malloc()。没有必要将其初始化为0,然后再用数据进行初始化。


0
如果你想分配100个整数,你需要这样做:
int *var;

var = malloc(100 * sizeof(int));
// OR
var = calloc(100, sizeof(int));

因为malloc需要一个字节数参数,而calloc需要一个元素数量和元素大小作为参数,它会自行计算总共需要的空间,并将分配的内存全部填充为零。

0

一个是原始的(malloc()),另一个更像是方便函数(calloc())。本质上,你可以将calloc()想象成这样实现:

void * my_calloc(size_t num_elems, size_t elem_size)
{
  const size_t bytes = num_elems * elem_size;
  void *p;

  if((p = malloc(bytes)) != NULL)
  {
    memset(p, 0, bytes);
  }
  return p;
}

0

malloc 返回一个固定字节数的分配。这个内存没有被清除(垃圾值)。

calloc 返回一个特定内存对象数量的分配。这个内存被清零。


0
当您使用malloc分配内存时,内存仅用垃圾值分配,而当您使用calloc分配内存时,内存被分配并且每个内存位置都填充为0。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接