Можете ли вы объяснить, почему компилятор разделяет структуры узлов, добавляя 8 байтов между узлами?
Это совпадение. Не существует правил о том, как планировать память для любой последовательности вызовов malloc()
.
Адрес может быть возрастающим с фиксированным интервалом, убывающим с различными интервалами, (на первый взгляд) случайным образом, ...,. ...
Если вам нужны фиксированные относительные адреса, используйте массив
struct Node arr[3];
ptrdiff_t delta10 = &arr[1] - &arr[0];
ptrdiff_t delta20 = &arr[2] - &arr[0];
ptrdiff_t delta21 = &arr[2] - &arr[1];
if (delta10 != delta21) /* cannot happen */;
или выделите группу элементов (возможно, с realloc()
) одновременно
struct Node *elements = malloc(3 * sizeof *elements);
ptrdiff_t delta10 = &elements[1] - &elements[0];
ptrdiff_t delta20 = &elements[2] - &elements[0];
ptrdiff_t delta21 = &elements[2] - &elements[1];
if (delta10 != delta21) /* cannot happen */;
free(elements);