chr*_*yal 11 c memory malloc memory-management calloc
将存储器清零(即calloc()结束malloc())的优点是什么?你不会将价值改为其他东西吗?
Alo*_*hal 16
有两个阵营:一个表示在声明变量时初始化变量有助于发现错误.这个阵营中的人确保他们宣布的所有内容都已初始化.他们将指针初始化为NULL,ints为0,等等.这个想法是一切都是确定的,当他们NULL在调试器中看到一个指针时,他们立即知道它没有正确设置.它还可以帮助您的程序在测试过程中崩溃,因为NULL-pointer解除引用而不是在生产运行中神秘地崩溃.
另一个阵营说,在声明时初始化变量会使调试更加困难,因为现在编译器无法警告你"未经设置使用"的变量.
没有告诉你我个人的偏好1:如果你属于第一阵营,你会想要calloc()而不是malloc().如果你属于第二阵营(这显然你这样做),那么你更喜欢malloc()了calloc().
现在有两个例外:
calloc(),但malloc()因为你是初始化浮点数字或指针,你知道,所有的位0并不一定意味着0他们.或者,您不需要额外的开销.calloc()分配一些数据并希望它全部为零.举例来说,如果你要计算的的逐行总和n通过m动态分配的int数据.1你可以在这里看到我对许多问题的答案,看看我属于哪个阵营:-).
calloc使用指针的结构:它们被初始化为NULL.在我很久以前工作的实时过程控制系统中,我们决定让上电逻辑将所有RAM初始化为0xCC(8086的interrupt 3指令).这将导致处理器进入监视器(原始调试器),如果它以某种方式执行未初始化的内存.(无益,8086快乐地执行包含零的内存,因为它们是add [bx+si],al指令.即使是32位模式也会使它们成为add [ax],al指令.)
我不记得我们是否曾找到失控程序,但是在各种值中对应于0xCC的值:52,428(无符号16位), - 19,660(带符号16位), - 107374176(32位浮点数)和-9.25596313493 e + 61(64位浮点)出现在许多意想不到的地方.此外,一些代码期望字符是7位ASCII - 也就是说,当它试图处理0xCC时,一个错误警告我们它的存在.