Это старый трюк на Си. Если вы не знаете, сколько нужно side_distances
, обычно потому, что оно варьируется от одного экземпляра nodeinfo
к другому, тогда вы объявляете размер массива нулевым. Затем, когда вы выделяете память для узла, вы выделяете размер структуры , как это было определено (sizeof(nodeinfo)
), плюс дополнительная память для количества значений, которые вы хотите в этом конкретном экземпляре (+something * sizeof(double)
). В результате для этого экземпляра у нас достаточно памяти для массива указанного нами размера.
Это «трюк» в том смысле, что для большинства применений вы можете выделить отдельный массив и сохранить указатель на него в этом массиве. Хранение всего в одном выделении - это (попытка) оптимизации.
IIRC, однако, массив нулевого размера допускается только стандартом C ++, но не стандартом C. В C вы должны определить его как массив гибкого размера side_distances[]
, хотя, без сомнения, многие компиляторы допускают версию C ++ в C как расширение. В любом случае, сама структура не содержит места для каких-либо элементов, хотя она будет правильно выровнена для double
.