在IT技术中,使用calloc()比malloc()更能发挥优势的原因是什么?不管怎样,您都会把值更改为其他内容吗?
在IT技术中,使用calloc()比malloc()更能发挥优势的原因是什么?不管怎样,您都会把值更改为其他内容吗?
NULL
,将int
初始化为0等。他们认为一切都是确定的,当他们在调试器中看到一个NULL
指针时,立即就知道它没有被正确设置。这也可以帮助你的程序在测试期间因NULL
指针解引用而崩溃,而不是在生产运行中神秘地崩溃。calloc()
代替malloc()
。如果你属于第二派人(显然你是),那么你更喜欢使用malloc()
而不是calloc()
。calloc()
而使用malloc()
,因为你正在初始化浮点数或指针,并且你知道所有零位并不一定意味着0
。或者,你不想增加额外的开销。calloc()
。例如,如果你想计算动态分配的为n
乘以m
的int
数据的逐行总和。1您可以查看我在此处关于SO的许多问题的答案,以确定我属于哪个阵营 :-)。
calloc
来分配指针结构:它们会被初始化为空。很久以前我曾经参与过实时处理控制系统的工作,我们决定让开机逻辑将所有RAM 初始化为 0xCC,这是8086的interrupt 3
指令。 这将导致处理器进入监视器(原始调试器),如果它执行未初始化的内存。(令人无奈的是,8086会欢快地执行包含零的内存,因为它们是add [bx+si],al
指令。即使是32位模式也会导致它们成为add [ax],al
指令。)
我不记得我们是否曾找到一个失控的程序,但在许多意想不到的地方,值为0xCC对应的值出现了:52,428(16位无符号整数),-19,660(16位有符号整数),-107374176(32位浮点数)和-9.25596313493e + 61(64位浮点数)。此外,当一些代码试图处理0xCC时,一些期望字符是7位ASCII码的错误也提醒了我们。
calloc
函数将指针设置为NULL
是无用的,因为标准不能保证所有位为零等于NULL
。同样适用于浮点数。 - Alok Singhal(void *)0
作为NULL,IEEE浮点格式都将“位全零”作为真正的零。 - wallyk(void *)0
不一定全部为零。编译器必须将 (void *)0
转换为适当的“空指针常量”。同样,当你写 p = 0;
并且 p
是一个指针时,编译器必须将 p
设置为一个等于空指针常量的比特模式,这个常量不一定是所有位都为零。 - Alok Singhalunsigned char
和C99固定大小类型(u)intN_t之外),允许具有填充位,将其设置为0可能会成为陷阱表示(例如,如果存在反奇偶校验位,则全零位是奇偶校验错误的情况)。虽然不太可能出现,但如果你遵循标准,那么你就必须按照标准去执行... - Steve Jessopcalloc
,则必须手动遍历它,并在算法开始时将其初始化为零。calloc
可能可以更有效地为您执行此操作。知道你分配的任何内容都被初始化为零是好的。许多错误都源于使用未初始化的内存的代码。另外,一些结构体/类的默认值可能为零,因此您无需在malloc之后更改所有值。
例如,使用malloc为其中一些指针配置了一个结构体。除非将它们设置为NULL,否则NULL检查并不总是有效。如果您使用calloc,则不需要为指针值执行额外的初始化步骤。
calloc
使指针被设置为NULL
是没有意义的,因为标准并没有保证所有位为零等于NULL
。 - Alok Singhal除了初始化变量的好处外,calloc还有助于跟踪错误。
如果您意外地使用未正确初始化的分配内存的一部分,则应用程序将始终以相同的方式失败。例如,从空指针引起的访问冲突。使用malloc时,内存具有随机值,这可能导致程序以随机方式失败。
随机故障非常难以跟踪,而calloc有助于避免这些问题。
brk()
或sbrk()
系统调用(Linux系统调用扩展内存分配)出于安全考虑返回清零的内存。堆管理器从sbrk()
请求额外的内存。但是当本地分配释放某些内容时,堆管理器可能在后续分配之前不会清除它——只设置头信息以进行管理。 - wallyk