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

时间:2013-09-10 06:13:17

标签: c stack malloc heap calloc

假设我有一个结构:

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))

我的代码在执行此操作时会出现分段错误。

我想知道为什么会失败以及在什么情况下会有什么原因?

2 个答案:

答案 0 :(得分:2)

  

calloc和memset将内存归零的方式有什么不同吗?

没有。实际上,calloc可能会在内部调用memset。

  

我想知道为什么会失败以及在什么情况下会有什么原因?

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

  

我的代码在执行此操作时会出现分段错误。

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

答案 1 :(得分:0)

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