C中的指针行为:节点后初始化链表头

时间:2017-10-01 01:25:58

标签: c pointers

我对这种C行为感到有些困惑。如果我在节点之后初始化“head”指针,它似乎不会继续保持下一个元素。示例代码如下:

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


typedef struct node {
    int value;
    struct node* next;
} node;

int main(void)
{
    node* head = NULL;
    node* current = malloc(sizeof(node));
    current->value = 1;

    if(head == NULL)
        head = current;

    current = current->next;

    current = malloc(sizeof(node));
    current->value = 2;

    printf("%d\n", current->value); // 2
    printf("%d\n", head->value); // 1
    printf("%d\n", head->next->value); //Segmentation fault: 11, Should be 2

    return 0;

}

据我了解:我将malloc()内存用于当前,然后设置该值。然后将头设置为等于当前。他们现在都指向同一个节点。

然后我创建current = current-&gt; next,malloc内存并设置值。

为什么head-&gt; next-&gt;值不指向与current-&gt;值相同的位置?

2 个答案:

答案 0 :(得分:0)

要创建2个链接的节点,您需要将第一个next保存到第二个节点。

更改

current = current->next;

current = malloc(sizeof(node));
current->value = 2;

current = malloc(sizeof(node));
current->value = 2;
head->next = current;

这将创建一个新节点(重新使用您已分配给head的当前指针)并将其附加到head

在实践中虽然您可能不希望将它附加到这样的head,因为它不会像超出2的那样工作。您想在列表的末尾创建一个新条目,即开头列表,或将其插入列表中间。

答案 1 :(得分:0)

这不符合你的想法:

current = current->next;

在此声明之前,您有:

             ---------------
current ---> |   1  |   ?  |
             ---------------

current指向一个足够大的内存区域,node value的值为next且值malloc未知current }返回未初始化的内存。

在此语句之后,current->next包含current = malloc(sizeof(node)); 包含的垃圾值。当你这样做时:

current

您将malloc的值更改为返回的current->next = malloc(sizeof(node)); current = current->next; ,覆盖之前的值。

要做你想做的事,你需要这样做:

DataFrame.as_matrix()