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;
在你的例子中有一些明显的和更微妙的问题:
-
*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的区别?