无法重新迭代指针数组

时间:2017-11-10 06:18:10

标签: c arrays pointers dynamic-programming traversal

我有一个从文件读入的项目指针数组。这些项目为typedef structs

我的数组可以调整大小,因为该文件包含很多项目。

while (fscanf(fp, "%X %[^\n]", &code, string) != EOF) {
    if (list->length >= list->capacity) {
        list->capacity *= 2;
        list->items = (Item**)realloc(list->items,
            list->capacity * sizeof(Item*));
    }
    item.code = code;
    strcpy(item.string, string);
    list->items[list->length++] = &item;
}

假设已经宣布listitem。空间被列入列表中。

static List * list;& Item item = { 0, { 0 } };

在代码中先前声明并初始化。 list是必要的全局变量。

如果我尝试通过尝试获取第一个值来迭代这个完整的列表:

printf("line %d: %X\t%-89s\n", 1, list->items[0]->code, list->items[0]->string);

我将从中获取文件中的最后一个元素。但是,如果我在前面提到的while循环中包含此printf,我将获得所需的控制台输出(当索引为list->length时)。

为什么我会遇到这种行为?有什么我忘记了遍历指针吗?

1 个答案:

答案 0 :(得分:1)

您似乎使用item作为自动Item对象,因此使用指向同一list->items对象的指针填充Item数组。

您可能希望每个循环中都有一个新的Item。像:

Item* newItem;
while (fscanf(fp, "%X %[^\n]", &code, string) != EOF) {
    newItem = malloc(sizeof *newItem);
    if (!newItem) exit(1);

    if (list->length >= list->capacity) {
        list->capacity *= 2;
        list->items = (Item**)realloc(list->items,   // BTW DONT DO THIS - SEE BELOW
            list->capacity * sizeof(Item*));
    }
    newItem->code = code;
    strcpy(newItem->string, string);
    list->items[list->length++] = newItem;
}

BTW:总是realloc到tmp指针,如:

tmp = realloc(....);
if (tmp == NULL)
{
    // error handling
}
else
{
    list = tmp;
}

此外:在C中,通常不建议cast malloc / realloc / calloc。通常使用sizeof *pointer代替sizeof(type)

所以而不是:

list->items = (Item**)realloc(list->items, list->capacity * sizeof(Item*));
你可以这样做:

tmp = realloc(list->items, list->capacity * sizeof *tmp);

其中tmplist->items

的类型相同