【问题标题】:Is there a difference in the way memory is zeroed by calloc and memset?calloc 和 memset 将内存归零的方式有什么不同吗?
【发布时间】:2013-09-10 06:13:17
【问题描述】:

假设我有一个结构:

typedef struct
{
   int a;
   struct x;
   struct *x2;
   char *s;
}global_struct;

我有一个指针指向的内存等于结构的大小:

ptr = calloc(sizeof(global_struct),1);

我实际上不想在堆上分配内存,所以 id 将结构的变量声明为:

global_struct var_struct1;

我正在使用 memset 将内存初始化为零。

memset(&var_struct1,0,sizeof(var_struct1))

当我这样做时,我的代码给出了分段错误。

我想知道这是否会失败以及在什么情况下会失败?

【问题讨论】:

  • 你从来没有在你的问题中malloc。你错过了什么吗?
  • 显示的代码应该可以正常工作。如果您正在执行显示的操作,那么 Segfault 来自其他地方,不在显示的代码中。
  • 这是代码中唯一的区别。我已对其进行了修改以显示更多详细信息
  • 作为旁注,标准预见的初始化变量的构造是初始化器,= { 0 } 在您的情况下就足够了。在具有非全位零的空指针的怪异架构上,这可能是唯一正确的方法。在这样的架构上callocmemset 是不正确的。
  • var_struct1 是一个对返回其地址的函数具有局部作用域的变量吗?

标签: c malloc heap-memory stack-memory calloc


【解决方案1】:

calloc 和 memset 将内存归零的方式有区别吗?

没有。事实上,calloc 很可能在内部调用 memset。

我想知道这是否会失败以及在什么情况下会失败?

没有。你的calloc参数的顺序不对,应该是calloc(1, sizeof(global_struct));。虽然在这种情况下,参数的顺序实际上并不重要。

当我这样做时,我的代码给出了分段错误。

问题可能出在代码的其他地方。

【讨论】:

    【解决方案2】:

    可能会有所不同。在 vms 系统上,空闲时间可能发生的事情之一是空闲列表中的页面可以归零,并移动到归零的空闲列表中,这样可以隐藏 calloc 背后的一些成本。您的里程可能会有所不同。

    【讨论】:

      猜你喜欢
      • 2013-03-06
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 2021-01-08
      • 2011-01-16
      • 2011-04-08
      • 2013-11-14
      相关资源
      最近更新 更多