繁体   English   中英

关于calloc vs malloc的C教程问题

[英]C tutorial question relating to calloc vs malloc

我正在学习本教程http://theocacao.com/document.page/234 )。 我对这一段感到困惑,主要是与calloc相关的行:

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

最后一行让我感到困惑。 清除记忆是什么意思?

函数calloc将确保返回的内存中的所有字节都设置为0. malloc没有这样的保证。 它返回的数据可以并且将包含看似随机的数据。

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

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

Foo* pFoo = malloc(sizeof(Foo));
pFoo->Value1 = 0;
pFoo->Value2 = 0;

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

准确地说:

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

应该读:

这在某些情况下隐藏不可预测的行为和崩溃非常有用

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

是否使用calloc来“防止崩溃”如引言中所描述的实际上是有道理的是一个不同的问题。 我会说它确实可以提高懒惰程序员编写的代码的稳定性,因为它会将各种垃圾值触发的所有可能的意外行为折叠成由全零值触发的一个特定的意外行为。

malloc()函数分配内存块但不初始化已分配的内存。如果我们尝试访问内存块的内容,那么我们将得到垃圾值。

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

:如何使用malloc()函数作为calloc()

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM