我正在阅读C中的指针和动态内存分配。我发现函数calloc()
与malloc()
类似,但前者确实将内存初始化为0。
我不明白为什么将内存初始化为零?
注意:我不是在询问malloc和calloc之间的区别,而是将内存初始化为零的意思。
提前致谢。
答案 0 :(得分:11)
p = calloc(12, 1024);
大致相当于:
p = malloc(12 * 1024);
if (p != NULL)
memset(p, 0, 12 * 1024);
所以calloc
执行malloc
没有的两件事:
nmemb
和size
变量相乘以计算分配的总大小为此, calloc
适用于分配数组,特定的标量值数组。
有些情况下不需要进行初始化:
NULL
可能不是全零。答案 1 :(得分:3)
每个对象都有一个底层表示形式作为内存中的字节序列。当通过calloc
获取时,这些字节的值为零。这对特定对象意味着什么取决于它们在内存中的表示方式。例如,uint16_t
保证在没有填充的情况下占用16位,并且表示位构成其值,因此*(uint16_t*) calloc(sizeof(uint16_t), 1)
是保持值为零的对象。相反,如果您通过malloc
获取内存,则必须不尝试从中读取内存,而是必须首先为其分配值。< / p>
答案 2 :(得分:3)
答案 3 :(得分:2)
分配内存时,您向操作系统发出请求,为程序的使用预留一块内存。简单地保留存储器并不一定意味着已经初始化了存储器中的任何数据。
答案 4 :(得分:2)
初始化为零的内存是当您将其作为非填充类型(例如*** LOG [Mon Apr 25 23:42:49 CEST 2016] TEST : Test filter on site.siteId = 'NEW' 2 documents
)读取时,每个可寻址对象(每个字节)始终具有等于零的值的内存,
从某种意义上说,它总是获得相同的内存内容(而不是“随机”垃圾)。这消除了此内存块可能充当程序的非确定性行为的潜在来源的可能性。确定性行为可以帮助您更早地发现错误。
答案 5 :(得分:1)
这只意味着在保留该存储块后所有位都将设置为零。结果取决于您对数据的解释。例如,如果将它们转换为内存地址/指针,它们将等效于NULL。如果将它们转换为某种整数类型,它们将等效于零值整数。
是否要使用malloc()并保留垃圾值(所以只保留内存而不修改以前的值)或使用calloc()来获取干净的内存块取决于你计划做什么用这个内存块。通常,在谈论普通软件时,将所有内存值设置为零的成本可以忽略不计,但是如果您正在开发一个性能极高的软件,那么每一点都很重要,您可以自由地使用这些内存将其设置为零。
答案 6 :(得分:1)
@Blorgbeard在一篇评论中说。我只是意味着您要分配的块中的每个字节都将设置为0x00
。