以零为单位初始化malloc而不是使用calloc

时间:2016-09-08 01:25:07

标签: c

我想使用c('a','w','r','t') 在堆中创建动态数组。

malloc

问题在于初始化为零,我希望尽可能避免使用int *c = malloc(5 * sizeof(int)); ,因为我不知道它有多安全。

如果我使用calloc,是否会执行相同的calloc工作?

3 个答案:

答案 0 :(得分:2)

你可以使用calloc(),这是安全的,或者为什么它会在标准库中实现?如何?对于大型分配,它可能比malloc() + memset()更有效。

答案 1 :(得分:1)

<强>的malloc():

malloc()需要一个争论:要分配的字节数。分配的字节是未初始化。因此,它们的值可以是0-255之间的任何值,或者这些数字的任意组合。 不要指望任何事情!

代码示例:

int *mem = malloc(5 * sizeof(int));

<小时/> 的释放calloc():

calloc()有两个争论:为每个元素分配内存的元素数量以及需要为每个元素分配的内存量。 将每个字节初始化为零。

代码示例:

int *mem = calloc(5, sizeof(int));

来自 C编程语言 ~Brian W. Kernighan和Dennis M. Ritchie:

  

void * calloc(size_t nobj,size_t size)
  calloc返回指向nobj对象数组的空间指针,
  每个尺寸大小,如果不能满足请求,则为NULL   空格初始化为零字节。

[强调我的]

或者,您可以使用memset()

初始化内存
#include <string.h> // for memset()

//allocate memory
int *mem = malloc(5 * sizeof(int));

//initialize memory to zeros
memset(mem, 0, 5 * sizeof(int));

答案 2 :(得分:0)

如果您因某些原因想避免使用calloc,可以使用memset。你可以这样做:

memset (c, 0, 5 * sizeof(int));

不要忘记检查malloc的返回值。