何时在 C 中使用 calloc 或 malloc [duplicate]

When to use calloc or malloc in C [duplicate]

提问人: 提问时间:6/16/2022 最后编辑:chqrlie 更新时间:6/16/2022 访问量:199

问:

哪个更好/更有效 - 或者?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;
c struct malloc calloc

评论


答:

1赞 chqrlie 6/16/2022 #1

在您的示例中,存在明显且更微妙的问题:

  • *void name;是语法错误。

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

    这是名称阴影的病态示例,其中本地定义在外部作用域中隐藏了同一标识符的另一个定义。用于让编译器检测并报告此类问题。-Wshadow

在这两个示例中,都应使用指针指向的数据的大小:

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

关于是否使用 或 ,出于以下原因,始终使用要安全得多:calloc()malloc()calloc()

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

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

malloc 和 calloc 的区别?