0

我尝试编写一个代码来读取几次链表而不调用特定函数,例如void print(t_list *list),请参见下面的代码。我可以弄清楚为什么我的代码无法在 while 上下文中第二次读取我的链表,因为在我的第一个循环结束时,我的 structt_listNULL,而当我开始第二次时,我的 struct 仍然是NULL,显然什么都不能使用。

所以我有两个问题,

第一个:为什么当我通过函数时我可以读取两次我的链表void print(t_list *list),这很好,因为这是工作,但我不明白为什么在第二次读取时我t_list不是NULL

第二:如何在whileorfor上下文中,将我的指针倒回t_list开始,再次读取链表。

#include <stdlib.h>
#include <stdio.h>

typedef struct s_list t_list;
struct s_list {
    int arg;
    t_list *next;
};


int add(t_list **ref, int arg) {
    t_list *temp;
    temp = NULL;
    if(!(temp = (t_list*)malloc(sizeof(t_list))))
        return (0);
    temp->arg = arg;
    temp->next = (*ref);
    (*ref) = temp;
    return(1);
}

void change(t_list *list) {
    printf("change arg:\n");
    while(list) {
        list->arg = 42;
        list = list->next;
    }
}

void print(t_list *list) {
    printf("list:\n");
    while(list) {
        printf("arg: %i\n",list->arg);
        list = list->next;
    }
}

int main() {
    t_list *list;
    list = NULL;
    add(&list, 0);
    add(&list, 1);
    add(&list, 2);
    print(list); // work fine
    change(list);
    print(list); // work fine it's possible te read a second time but why ?
  
    // that's way don't work a second time
    while(list) {
        printf("arg: %i\n",list->arg);
        list = list->next;
    }

    while(list) {
        printf("arg: %i\n",list->arg);
        list = list->next;
    }

    return (0);
}

安慰

➜  LINKED_LIST git:(master) ✗ clang linked_list.c && ./a.out
print list:
arg: 2
arg: 1
arg: 0
change arg:
print list:
arg: 42
arg: 42
arg: 42
while arg: 42
while arg: 42
while arg: 42
4

1 回答 1

1

正如评论中所指出的,我认为您应该阅读有关C 变量作用域的信息。

当您传递listprint()方法时,指针变量的值t_list* list被复制到print()方法的参数中。所以无论你做什么print方法t_list* list都不会影响主要方法t_list* listlist您可以通过检查调用print()方法之前和之后的值来确认这一点:

    printf("%p\n", list);
    print(list); 
    printf("%p\n", list);
    print(list); 
    printf("%p\n", list);

它们都应该打印相同的值,因为list在 main 函数的范围内没有改变:

0x17222e0
list:
arg: 2
arg: 1
arg: 0
0x17222e0
list:
arg: 2
arg: 1
arg: 0
0x17222e0
arg: 2
arg: 1
arg: 0
于 2020-10-14T11:06:33.967 回答