通过引用传递GList

时间:2013-11-11 01:58:04

标签: c linked-list glib

我正在尝试将实体的注册表维护为链接列表,其中包含一组函数,这些函数接受对列表的引用并对其进行修改。我已经将这种策略与结构中的GLists结合使用,效果非常好,但为此我不需要容器结构。我想要做的是:

// 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()时被复制,但我在不应该为了原因而丢失 - 并且通过& reference 传递它,因为(据我的理解)创建一个带有GList* Foo;语法的GList无论如何都会产生指针。

我确信我误解了我正在做的事情,但我一直在盯着这几个小时。

1 个答案:

答案 0 :(得分:2)

您正在向您的函数传递一个指针,这意味着您可以修改指针所指向的内容,在本例中为NULL,并使用本地指针(作用于您的函数{{ 1}})指向anne_entity_create,然后指向该指针,您“附加”您的列表,这使得它只能在本地访问。

所以你需要使用双重间接:将一个指针传递给你的函数的head-of-list指针,然后对它进行操作,这样你就可以改变列表的实际头部,而不是传递地址的副本列表的头部。希望您理解,随意提出更多要求。

NULL