Вам нужно будет изучить модель памяти C более внимательно. Ваш код содержит ошибку, типичную для новых программистов на Си. Требуемая структура данных выглядит примерно так:
struct node {
client_t client; // Not a pointer!
node_t *next;
};
Как вы уже определили, узел хранит только указатель на client_t
. Вы выделяете client_t
как локальную (C auto) переменную и передаете указатель на нее в распределитель узлов, но эта локальная переменная имеет область действия, которая заканчивается после каждой итерации цикла.
С новым определением запись клиента в узле сохраняется до тех пор, пока вы явно не free()
it.
Соответствующим обновлением для распределителя узлов будет
node_t * node_add(node_t *head, client_t *c) {
node_t *new = (node_t *)malloc(sizeof(node_t));
if (new == NULL) {
return NULL;
}
new->client = *c; // Copy the entire client into the node.
new->next = head;
return new;
}
закомментированная строка является struct
присваиванием. Он копирует оба поля client_t
в узел.
Чтобы использовать клиентскую информацию, которая теперь хранится в узле, вы будете использовать .
вместо ->
: например, node->client.ID
.