我定义了以下函数,其中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()
工作?
答案 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));