提问人: 提问时间:6/16/2022 最后编辑:chqrlie 更新时间:6/16/2022 访问量:199
何时在 C 中使用 calloc 或 malloc [duplicate]
When to use calloc or malloc in C [duplicate]
问:
哪个更好/更有效 - 或者?calloc
malloc
我想初始化结构,这些结构也引用同一结构的其他实例
变式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;
答:
1赞
chqrlie
6/16/2022
#1
在您的示例中,存在明显且更微妙的问题:
*void name;
是语法错误。既不分配也分配正确的内存量,因为计算结果为定义中指针的大小,而不是定义为 的 typedef 的类型。
struct _person* person = calloc(1, sizeof(person));
struct _person* person = malloc(sizeof(person));
sizeof(person)
person
person
struct _person
这是名称阴影的病态示例,其中本地定义在外部作用域中隐藏了同一标识符的另一个定义。用于让编译器检测并报告此类问题。
-Wshadow
在这两个示例中,都应使用指针指向的数据的大小:
struct _person *person = calloc(1, sizeof(*person));
关于是否使用 或 ,出于以下原因,始终使用要安全得多:calloc()
malloc()
calloc()
- 元素的大小和元素的数量是分开的,从而避免了整体尺寸计算中的愚蠢错误。
- 内存初始化为所有位零,这是现代系统上所有标量类型的零值。这允许您通过省略整数成员的显式初始化来简化代码,并将强制初始化以后添加到结构定义中的所有额外成员,而分配函数可能缺少初始化语句。
0
- 对于大型数组,实际上比 + 快,如以下答案所示: https://stackoverflow.com/a/18251590/4593267
calloc()
malloc(size)
memset(s, 0, size)
关于这个话题的更一般性的讨论是另一个问题:
评论