为什么我的calloc无法将所有内容归零?

时间:2011-06-12 16:41:05

标签: c cygwin

我定义了以下函数,其中List是一个结构。

List * LIST_Create()
{
  List * l = calloc(0, sizeof(List));
  unsigned char * pc = (unsigned char *)l;  
  for(i = 0; i < sizeof(List); i++)
  {
    LOG("LIST","0x%1x ", (unsigned char)*pc);
    pc++;
  }
}

当我打印出字节时,我得到了这个:

LIST: 0xffffffbf 
LIST: 0x1 
LIST: 0x13 
LIST: 0x0 
LIST: 0x1 
LIST: 0x1 
LIST: 0x0 
LIST: 0x0 
LIST: 0x0 
LIST: 0x0 
LIST: 0x0 
LIST: 0x5 

发生了什么事?我知道这不是打印的问题,因为代码也在读取非零值。我可以可靠地将List结构清零的唯一方法似乎是单独初始化所有成员。我不介意,但不应该calloc()工作?

5 个答案:

答案 0 :(得分:6)

您为0 List s分配了足够的空间:

List * l = calloc(0, sizeof(List));

因此,您分配的内存长度为0个字节。

答案 1 :(得分:3)

calloc(0, sizeof(List))分配一个0长度的缓冲区;在创建“虚拟”指针后打印随机数据,以便稍后realloc()calloc的参数是项目数和单个项目的大小;这样可以更容易地分配5 (struct foo) s的矢量。

答案 2 :(得分:2)

手册说:

   calloc()  allocates memory for an array of nmemb elements of size bytes
   each and returns a pointer to the allocated memory.  The memory is  set
   to  zero.  If nmemb or size is 0, then calloc() returns either NULL, or
   a unique pointer value that can later be successfully passed to free().

您的函数调用List * l = calloc(0, sizeof(List));

因此,您有0长度的内存块地址或NULL l。 (可能你和memset混在一起了?)

答案 3 :(得分:1)

您正在请求分配零字节。 calloc分配的大小为nmemb*size,您有nmemb == 0

答案 4 :(得分:1)

您使用0个元素(无元素)调用calloc。你至少要通过1:

List* l = calloc(1,sizeof(List));