malloc
- 参数: 分配空间大小
- 返回值: 分配空间首地址指针
- 空间状态: 未初始化
calloc
- 参数1: 元素数量
- 参数2:元素所占空间大小
- 返回值:分配空间首地址指针
- 空间状态: 初始化为0
calloc会比malloc略慢,但会将分配的空间初始化为0,大部分情况下,从安全性上考虑,个人喜欢用calloc。
malloc在以下情况下有一定概率出错:
typedef struct {
uint8_t *data;
uint32_t len;
} expample_t;
expample_t* allocate(uint32_t length)
{
// 1
expample_t *p = malloc(sizeof(expample_t));
if (p == NULL) {
goto err;
}
// 2
if (length > 10) {
goto err;
}
p->len = length;
p->data = malloc(p->len * sizeof(uint8_t));
if (p->data) {
goto err;
}
// ...
return p;
err:
if (p) {
// 3
if (p->data) {
free(p->data);
p->data = NULL;
}
free(p);
p = NULL;
}
return NULL;
}
在记号1处,使用了malloc,空间未初始化,p->data
有可能不是NULL,此时若记号2处判断length > 10
为真,跳转到err
准备释放内存,但由于p->data
不一定是NULL,尝试free(p->data)
时就会出错。若此处都采用calloc或者在malloc后用memset将空间初始化为0则可以避免。