Выделение памяти в динамическом связанном списке структур - PullRequest
0 голосов
/ 28 мая 2019

Какая разница в распределении памяти с помощью Malloc или Calloc в этом примере?
С Calloc память разрывается, но с Malloc все в порядке!
Мой пример похож на (но со многими значениями):

enter image description here

Если код неправильный, как мне это сделать?

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;

...

1 Ответ

1 голос
/ 28 мая 2019

Какая разница в выделении памяти с помощью Malloc или Calloc в этом примере?

При условии, что a и b оба положительны и a * b не переполняется,Разница между calloc(a, b) и malloc(a * b) заключается только в том, что calloc инициализирует выделенную память нулевыми битами.Ничего другого.

С Calloc память разрывается, но с Malloc все в порядке!

Ваша программа неисправна независимо от того, используете ли вы calloc() или malloc(),ломается ли это шумно или нет.Вы выделяете память для NO, но затем разыменовываете его указатель person, не назначая его для указания на действительный объект.Результат не определен независимо от того, какую функцию распределения вы используете.

...