无法重新分配c数组结构

时间:2015-01-04 16:16:12

标签: c arrays struct

我有像这样的结构

typedef struct ll_node {
    uint data;
    struct ll_node* next;
} ll_node;

typedef struct {
    ll_node* head;
    uint     count;
} linked_list;

typedef struct {
    linked_list* lists;
    uint list_size
} Context;

我需要能够从上下文动态增长列表。以下是我如何向列表数组添加链接列表

void add_list(Context* c) {
    if (c->list_size == 0) {
        c->lists = malloc(sizeof(linked_list));
    } else {
        realloc(c->lists, sizeof(linked_list) * (c->list_size + 1));
    }
    linked_list_init(c->lists[c->list_size]);
    list_size++;
}

每当我重新分配时,问题就会出现。我丢失了不是列表中最新索引的数据。因此,如果c->列表[0]包含1 ==> 1 ==> 2那么它将会消失并且c-> lists [1]将被初始化并准备好用于链表功能。

非常感谢任何帮助

1 个答案:

答案 0 :(得分:4)

这是错误的

realloc(c->lists, sizeof(linked_list) * (c->list_size + 1));

应该是

c->lists = realloc(c->lists, sizeof(linked_list) * (c->list_size + 1));

我会建议一种安全的方法来做到这一点

void *clists;

clists = realloc(c->lists, sizeof(linked_list) * (c->list_size + 1));
if (clists == NULL)
    handleCurrentErrorProbablyRetryOrAbortFillingTheListAndCleanupResources();
c->lists = clists

这样一来,如果失败,你就不会覆盖有效的c->list

提示:除非c->list_sizemalloc成功,否则请勿更新realloc,您需要检查返回非NULL }。