Я пытаюсь вести реестр сущностей как связанный список с набором функций, которые принимают ссылки на список и изменяют его на месте. Я использовал эту тактику с GLists внутри структур до отличного эффекта, но для этого мне не нужна структура контейнера. То, что я пытаюсь сделать это:Pass GList по ссылке
// Creates a new entity and appends it to the global entity index.
// Returns ID of the newly created entity, not a pointer to it.
int anne_entity_create(char entity_name[], char entity_type[], GList *Entities) {
ANNE_ENTITY *newEntity = malloc(sizeof(ANNE_ENTITY));
ANNE_ENTITY_RECORD *newEntityRecord = malloc(sizeof(ANNE_ENTITY_RECORD));
newEntity->id = anne_entity_get_next_id(Entities);
sprintf(newEntity->name, "%s", entity_name);
sprintf(newEntityRecord->name, "%s", entity_name);
newEntityRecord->entity = newEntity;
Entities = g_list_append(Entities, newEntityRecord);
printf("Index length: %i\n", g_list_length(Entities));
return newEntity->id;
}
//Entity system setup
GList* Entities = NULL;
printf("Entity ID: %i\n", anne_entity_create("UNO", "PC", Entities));
printf("Entity ID: %i\n", anne_entity_create("DOS", "PC", Entities));
printf("Index length: %i\n", g_list_length(Entities));
g_list_length()
внутри anne_entity_create()
возвращает 1, в то время как та же функция выполняется за пределами возвращает 0. Очевидно, что GList копируется как это передается anne_entity_create()
, но я m в убытке за причину - и передать его & ссылка не должна быть необходимой, поскольку (насколько я понимаю) создание GList с синтаксисом приводит к указателю в любом случае.
Я уверен, что я неправильно понимаю то, что я делаю совершенно, но я уже несколько часов проделывал это.
'GList ** Сущности; * Сущности = NULL; 'segfaults. Заглядывая в нее, но я только понимаю, что вы предлагаете. –
Принцип этого ответа правильный, но приведенный код действительно будет segfault. Я пошел дальше и отредактировал его ;-) – ptomato
Да, я испортил, это segfaults, потому что двойной указатель не инициализирован, как изменен картофель, вы должны передать ссылку указателя или выделить двойной указатель, но решение, предоставляемое картофелем лучше. – Sinn