0

のような特定の関数を呼び出さずに、リンクされたリストを数回読み取るコードを作成しようとしましたvoid print(t_list *list)。以下のコードを参照してください。while コンテキストでリンクされたリストを 2 回目にコードを読み取れない理由を理解できます。これは、最初のループの最後で構造体t_listNULLであり、構造体が静止している間に 2 番目のループを開始するNULLと明らかに何も使用できないためです。

そこで、質問が2つあるのですが、

void print(t_list *list)最初 : 関数を渡すと、リンクされたリストを 2 回読み取ることができるのt_listはなぜですか。NULL

second : 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 Variable Scopesについて読む必要があると思います。

メソッドに渡すと、ポインタ変数の値がlistメソッドの引数にコピーされます。したがって、メソッドの何をしても、メイン メソッドの には影響しません。これは、メソッドを呼び出す前後の値を確認することで確認できます。print()t_list* listprint()printt_list* listt_list* listlistprint()

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

listメイン関数のスコープで変更されていないため、すべて同じ値を出力する必要があります。

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 に答える