【发布时间】:2017-11-10 06:18:09
【问题描述】:
我有一个从文件中读取的项目指针数组。这些项目是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);
我将从这里获取文件中的最后一个元素。但是,如果我将这个printf 包含在上述while 循环中,我将获得所需的控制台输出(当索引为list->length 时)。
为什么我会遇到这种行为?关于遍历指针有什么我忘记了吗?
【问题讨论】:
-
永远不要将
realloc直接插入目标指针 - 始终使用临时变量并检查 NULL -
您一直在将指针分配给 same 项!你不应该在每次迭代中
mallocnewItem。如果你连续穿红色、绿色和黄色的衬衫,彩虹色的不是3个人,只有你穿着黄色的衬衫。 -
您需要说明
List和Item是如何声明的。看来你在Item和Item*之间搞砸了 -
@AnttiHaapala 很抱歉,您的类比没有意义。不过,我明白你所说的重复内容。
-
@compolo 但绝对可以!您没有 n 个不同的
Item对象。只有一个,n指针指向那个项目。
标签: c arrays pointers dynamic-programming traversal