在c语言中何时使用calloc或malloc



callocmalloc哪个更好/更高效?

我想初始化结构,它也引用同一结构的其他实例

变体1

person *new_person() {
struct _person *person = calloc(1, sizeof(person));
person->name = NULL;
person->child = NULL; 
return person;
}

变种2

person *new_person() {
struct _person *person = malloc(sizeof(person));
person->name = NULL;
person->child = NULL;
return person;
}

在结构

typedef struct _person {
*void name;
struct _person *child;
} person;

在你的例子中有一些明显的和更微妙的问题:

  • *void name;是语法错误。

  • struct _person* person = calloc(1, sizeof(person));struct _person* person = malloc(sizeof(person));都不会分配正确的内存量,因为sizeof(person)将计算为定义中的指针person的大小,而不是struct _person定义的类型person的大小。

    这是名称遮蔽的一个病态例子,即局部定义在外部作用域中隐藏了同一标识符的另一个定义。使用-Wshadow让编译器检测并报告这类问题。

在这两个示例中,您应该指定指针所指向的数据的大小:

struct _person *person = calloc(1, sizeof(*person));

关于使用calloc()还是malloc(),始终使用calloc()更安全,原因如下:

  • 元素的大小和元素的数量是分开的,从而避免了在整体大小计算中出现愚蠢的错误。
  • 内存初始化为所有位0,这是现代系统中所有标量类型的零值。这可以通过省略整数成员的显式初始化来简化代码,并且将强制初始化后来添加到结构定义中的所有额外成员(分配函数可能缺少初始化语句)到0
  • 对于大型数组,calloc()实际上比malloc(size)+memset(s, 0, size)更快,正如记录的答案:https://stackoverflow.com/a/18251590/4593267

关于这个主题的更一般的讨论是另一个问题:

malloc和calloc的区别?

最新更新