【发布时间】:2019-10-14 08:26:40
【问题描述】:
本例中使用 Malloc 或 Calloc 分配内存有什么区别?
使用 Calloc 会破坏内存,但使用 Malloc 就可以了!
我的示例类似于(但具有许多值):
如果代码错误,我该怎么办?
typedef struct {
int ID, age;
} person;
typedef struct {
person *person;
struct NO *next;
} NO;
... // with calloc, the memory breaks
// with (NO*)malloc(sizeof(NO)) it´s fine
NO *p1, *px1, *px2;
px2 = (NO*)calloc(1, sizeof(NO));
p1 = px2;
px2->person->ID = 1; px2->person->age = 30;
px2->next = NULL;
px1 = px2;
px2 = (NO*)calloc(1, sizeof(NO));
px2->person->ID = 2; px2->person->age = 20;
px2->next = NULL;
px1->next = px2;
...
【问题讨论】:
-
您从未分配过 px2.person。您正在推迟一个未初始化的指针。 calloc 失败,因为内存归零并且访问 0 会导致段错误。使用 malloc 它是 UB,但您可能正在写入随机内存位置。
-
calloc 通过将 person 设置为 NULL 来帮助您。