为什么我的Linked List实现中的Push()函数显示了这种行为?

时间:2017-08-15 04:00:45

标签: c pointers

我写了一个Push()函数来推送链表中的元素。 下面是代码,我先写了:

struct node {
    int data;
    struct node *next;
};

void Push(struct node*, int);

int main(int argc, char** argv) {

    struct node *list = NULL;

    Push(list, 23);

    return 0;
}

void Push(struct node *list, int data) {
    struct node *newNode;

    newNode = (struct node*)malloc(sizeof(struct node));
    newNode->data = data;
    newNode->next = list;
    list = newNode;

}

代码编译得很好并且也可以执行但是无论我在List上推送了多少个数字,这些更改都没有反映出来,而且列表仍然是空的。

然后我用另一种方式创建了这个函数并使用了这样的双指针:

struct node {
    int data;
    struct node *next;
};

void Push(struct node**, int);

int main(int argc, char** argv) {

    struct node *list = NULL;

    Push(&list, 23);

    return 0;

}

void Push(struct node **list, int data) {
    struct node *newNode;

    newNode = (struct node*)malloc(sizeof(struct node));

    newNode->data = data;
    newNode->next = *list;
    *list = newNode;
}

这里的代码效果很好,并将元素推送到列表中,并且反映了更改。

所以,为什么它会显示出这样不同的行为,即使我做了一个小测试并发现两者都

*list

 list

包含相同的地址。以下是我为测试所做的事情:

struct node {
    int data;
    struct node *next;
};


void CheckAddress1(struct node *list) {
    printf("Address1 is: %p\n", list);
}

void CheckAddress2(struct node **list) {
    printf("Address3 is: %p\n", *list);
}

int main(int argc, char** argv) {

    struct node *list = NULL;

    CheckAddress1(list);
    CheckAddress2(&list);

    return 0;
}

,输出

Address1 is: (nil)
Address3 is: (nil)

这是因为两者都指向同一位置。 所以这意味着两者都应该有效。然后为什么不同的工作。你们可以详细说明吗?感谢

1 个答案:

答案 0 :(得分:2)

list中的

main()具有列表中第一个元素的地址。 *list提供list指向的内存位置中的内容。

在您的第一个程序中,您按价值将list传递给Push()。这意味着list中的Push()仅仅是listmain()的副本,对list的{​​{1}}所做的任何修改都是反映回Push()中的那个。

在第二个程序中,您将main()中的list指针作为main()的参数传递给Push(),并在Push()中操纵指向内存位置的值通过此指针,您可以有效地修改list中的main()

因此,您在Push()中所做的更改会反映给程序2的main(),但不会反映给程序1。