1

假设我有一个结构:

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

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

我想知道是否有任何理由说明为什么会失败以及在什么情况下会失败?

4

2 回答 2

3

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

不。事实上,calloc 可能会在内部调用 memset。

我想知道是否有任何理由说明为什么会失败以及在什么情况下会失败?

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

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

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

于 2013-09-10T06:46:15.750 回答
0

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

于 2014-09-04T17:19:23.377 回答