C关于calloc与malloc的教程问题

C关于calloc与malloc的教程问题,c,memory,memory-management,pointers,C,Memory,Memory Management,Pointers,我正在关注这个()。我对这一段感到困惑,主要是与calloc有关的行: 我们还可以使用malloc函数的一个变体,称为calloc。calloc函数接受两个参数:值计数和基值大小它还可以在返回指针之前清除内存,这有助于避免在某些情况下出现不可预知的行为和崩溃: 最后那句话把我弄糊涂了。清除内存意味着什么?函数calloc将确保返回内存中的所有字节都设置为0。马洛克没有做出这样的保证。它返回的数据可以而且将由看似随机的数据组成 这种区别对于数据成员的初始化非常有用。如果0是结构中所有值的良好默认值

我正在关注这个()。我对这一段感到困惑,主要是与calloc有关的行:

我们还可以使用malloc函数的一个变体,称为calloc。calloc函数接受两个参数:值计数和基值大小它还可以在返回指针之前清除内存,这有助于避免在某些情况下出现不可预知的行为和崩溃:


最后那句话把我弄糊涂了。清除内存意味着什么?

函数calloc将确保返回内存中的所有字节都设置为0。马洛克没有做出这样的保证。它返回的数据可以而且将由看似随机的数据组成

这种区别对于数据成员的初始化非常有用。如果0是结构中所有值的良好默认值,那么calloc可以简化结构的创建

Foo* pFoo = calloc(1, sizeof(Foo));
vs

为清晰起见,省略了空检查。

为准确起见:

这有助于避免 不可预测的行为和崩溃 某些情况

应改为:

这对隐藏很有用 不可预测的行为和崩溃 某些情况

在这种情况下,“清除内存”意味着用物理全零位模式填充内存。注意,从形式的角度来看,这种原始内存初始化只能保证与整数类型一起工作。即,保证整数类型的对象接收零的初始值。是否有任何其他类型将通过此实现进行有意义的初始化是由实现定义的。(需要超出C标准限制的额外标准才能提供额外保证。POSIX、IEEE 754等)

使用
calloc
来“防止崩溃”是否真的有意义,这是另一个问题。我要说的是,它确实可以提高懒惰程序员编写的代码的稳定性,从某种意义上说,它将把由各种垃圾值触发的所有可能的意外行为折叠成一个由所有零值触发的特定意外行为。

malloc()
函数分配内存块,但不初始化分配的内存。如果尝试访问内存块的内容,则会得到垃圾值

而函数将分配的内存分配并初始化为零。 如果我们试图访问内存块的内容,那么我们将得到0

Not:如何将
malloc()
函数用作
calloc()

通过使用
string.h
库的
memset()
函数,可以将
malloc()
函数用作
calloc()
函数,如下所示

int *ptr;
ptr=malloc(size);
memset(ptr,0,size);

…其结果是,如果您没有正确初始化内存,将得到不可预测的结果。如果您还打算使用
realloc()
,则必须处理额外内存未归零的事实-因此您可能需要初始化代码来彻底(足够)完成这项工作。显然,如果您
calloc()
内存并且永远不会
realloc()
内存,那么这并不重要。“将,由看似随机的数据组成”-对于某些“随机”值。统计测试最有可能将其与均匀分布离散随机变量在0。。。UCHAR_MAX;-)
int *ptr;
ptr=malloc(size);
memset(ptr,0,size);