关于calloc vs malloc的C教程问题

时间:2010-02-06 19:39:19

标签: c memory memory-management pointers

我正在关注此tutorialhttp://theocacao.com/document.page/234)。我对这一段感到困惑,主要是与calloc相关的行:

  

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

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

4 个答案:

答案 0 :(得分:20)

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

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

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

VS

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

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

答案 1 :(得分:7)

准确无误:

  

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

应为:

  

在HIDING中很有用   不可预知的行为和崩溃   某些情况

答案 2 :(得分:4)

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

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

答案 3 :(得分:0)

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

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

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

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

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