gpt4 book ai didi

无法重新迭代指针数组

转载 作者:行者123 更新时间:2023-11-30 20:20:13 24 4
gpt4 key购买 nike

我有一个从文件中读入的项目的指针数组。这些项目是 typedef 结构

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

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 已声明。已为列表分配空间。

静态列表 * 列表; &项目项 = { 0, { 0 } };

在代码的前面声明和初始化。 list 必然是一个全局变量。

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

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

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

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

最佳答案

看来您使用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;
}

顺便说一句:总是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 类型相同

关于无法重新迭代指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47216720/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com