我在使用链接列表时遇到了一些麻烦。我不明白为什么这段代码会毫无问题地遍历和打印链表:
struct foo {
int data;
struct foo * next;
};
int main(void) {
struct foo * bar = NULL;
...
print(bar);
}
void print(struct foo * bar) {
while (bar != NULL) {
printf("%d, bar->data);
bar = bar->next;
}
}
然而,当我将列表放入另一个结构(如数组)中时,列表在遍历过程中被破坏,因为指针在以下位置重新分配bar[i] = bar[i]->next
:
struct foo {
int data;
struct foo * next;
};
int main(void) {
struct foo ** bar = (struct foo**)malloc(SIZE * sizeof(struct foo*));
for (i = 0; i < SIZE; i++)
bar[i] = NULL;
...
print(bar);
}
void print(struct foo ** bar) {
for (i = 0; i < SIZE; i++)
while (bar[i] != NULL) {
printf("%d, bar->data);
bar[i] = bar[i]->next;
}
}
为什么会这样?我知道在这种情况下编写print
函数的正确方法是:
void print(struct foo ** bar) {
struct foo * helper;
for (i = 0; i < SIZE; i++)
for (helper = foo[i]; helper != NULL; helper = helper->next)
printf("%d", helper[i]->data);
}
我只是想明白为什么。为什么指针在第一种情况下没有被重新分配,而在第二种情况下呢?我认为这与传递值与传递引用有关,但这意味着第一个函数也会破坏列表。谁能提供一些见解?