我有一个从文件读入的项目指针数组。这些项目为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;
}
假设已经宣布list
和item
。空间被列入列表中。
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
时)。
为什么我会遇到这种行为?有什么我忘记了遍历指针吗?
答案 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);
其中tmp
与list->items