【问题标题】:Pointer Behaviour in C: Initializing Linked List Head after NodeC 中的指针行为:在节点之后初始化链表头
【发布时间】:2017-10-01 01:25:58
【问题描述】:

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

#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->next,malloc 内存并设置值。

为什么 head->next->value 和 current->value 不指向同一个地方?

【问题讨论】:

  • 您永远不会在任何地方设置next。不在当前,不在头脑中。它的值是未定义的,很可能为零。所以你不能尝试取消引用它。
  • 'current = current->next;current = malloc(sizeof(node));'看看这两个语句 - 一个肯定是不正确的,因为第二个会覆盖第一个加载的值。
  • @TomKarzes 在我制作“current = current->next”然后 malloc 内存后,我是否不设置“next”?此时,'current->next' 和 'head->next' 不应该是同一个东西吗?
  • @MartinJames current 是一个指针,所以设置current = current-&gt;next 使current 指向current-&gt;next 指向的位置。之后我分配内存,所以什么都不会被覆盖。
  • @teafellow 当您使用malloc 时,它将选择指针的位置并将其返回给变量。它不会在您的指针当前所在的位置创建内存。这需要事先知道内存在哪里可用。

标签: c pointers


【解决方案1】:

这并不像你认为的那样:

current = current->next;

在这个声明之前,你有这个:

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

current 指向一个足以容纳node 的内存区域,其中value 的值为1,next 的值未知,因为malloc 返回未初始化的内存。

在此语句之后,current 包含 current-&gt;next 包含的垃圾值。当你这样做时:

current = malloc(sizeof(node));

您将current 的值更改为malloc 返回的任何值,覆盖之前的值。

要按您的意愿行事,您需要这样做:

current->next = malloc(sizeof(node));
current = current->next;

【讨论】:

    【解决方案2】:

    要创建 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。您想在列表的末尾创建一个新条目,即列表,或将其插入列表的中间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-06
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 2016-12-11
      • 2011-04-10
      • 1970-01-01
      相关资源
      最近更新 更多