«Размер 8» - подсказка: это размер указателя в вашей системе. Вы хотели выделить объект, а не указатель.
sizeof(Node)
совпадает с sizeof(struct node *)
, а sizeof(Table)
имеет аналогичную проблему.
Это сработало бы, если бы вы написали что-то вроде этого:
typedef struct table_s Table, *TablePtr;
...
TablePtr thisTable = malloc(sizeof(Table));
Если вы настаиваете на типах, как они, вы можете просто использовать следующую общую malloc
идиому:
// General form:
// T *p = malloc(sizeof *p);
// or:
// T *p = malloc(N * sizeof *p);
Table this_table = malloc(sizeof *this_table);
...
this_table->arrayOfNodes = malloc(thisTable->n * sizeof *this_table->arrayOfNodes);
Почему вызов malloc()
в строке 11 работает нормально, но в строке 8
вызывает эту ошибку?
Поскольку вы выделяете Table
(размер = 8), попытайтесь получить к нему доступ, как если бы это было struct table_s
(размер = 16). Ваше объявление array
в порядке, но перед этим вы пытаетесь записать указатель, возвращаемый malloc
в this_table->arrayOfNodes
, который находится со смещением 8 в структуре (то есть смещение 0 равно n
, а смещение 8 равно arrayOfNodes
). Короче говоря, вы пытаетесь записать вне выделенной памяти: вы выделили только 8 байтов, но вы пишете после первых 8 байтов структуры.