【问题标题】:assigning a pointer to anathor changes its value将一个指针分配给另一个指针会改变它的值
【发布时间】:2013-12-22 00:08:22
【问题描述】:

我正在尝试使用以下代码从链表中删除一个节点

void deleteMatchNode(node **list, int match)
{
    node **temp = list;
    node **prev = NULL;
    while (*temp != NULL)
        {
            if ((*temp)->member == match)
                {
                    printf ("match found\n");
                    break;
                }
            prev = temp;
            temp = &(*temp) ->next;
        }
    printf("gg1 %p %p\n", *temp, *prev);
    (*prev)->next = (*temp)-> next;
    printf("gg %p %p\n", *temp, *prev);
    printList(*list);
    //free(*temp);
}

但是 (*prev)->next 旁边的 (*temp)-> 的赋值正在改变 *temp 的值,请有人指出错误。 printList 按预期工作,但一旦在 *temp 上调用 free,列表就会损坏。

【问题讨论】:

  • 请格式化您的代码。
  • temp 指向list,所以它们是等价的。如果你在一个中做某事,你就会在另一个中做。

标签: c pointers linked-list


【解决方案1】:

我认为您的代码中的间距具有误导性。

prev = temp;
temp = &(*temp) ->next;

这与:

prev = temp;
temp = &((*temp)->next);

鉴于之前的作业,您可以这样写:

temp = &((*prev)->next);

所以temp 指向(*prev)->next,所以很自然地分配给(*prev)->next 会改变*temp 的值,因为它们是引用同一对象的两种方式。

您可能只想保存指向要从列表中删除的节点的指针以供以后释放:

Node *save = *temp;
(*prev)->next = (*temp)->next;
free(save);

您需要检查NULL 指针的多种可能性。如果循环在第一次迭代中退出,那么prev 将为空,如果循环因为*temp 为空而退出,那么*temp 自然为空。您需要考虑这两种情况。

【讨论】:

    【解决方案2】:

    当您离开while 循环时,*tempNULL。因此,(*temp)->next 不是一个有效的指针。

    【讨论】:

    • 除非循环已通过break 语句退出。
    【解决方案3】:

    我并不完全理解您的代码,但我认为在您的代码中: (*prev)->next 等于 *temp 因为这个,当你释放 temp 时,链接列表被破坏。
    我建议你使用这个:

    void deleteMatchNode(node **list, int match)
    {
        node *temp = *list;
        node *prev = NULL;
        while (temp != NULL)
            {
                if (temp->member == match)
                    {
                        printf ("match found\n");
                        break;
                    }
                prev = temp;
                temp = temp ->next;
            }
        printf("gg1 %p %p\n", temp, prev);
        if(temp == *list){
              *list = temp->next;
        }else{
              prev->next = temp->next;
        }
        printf("gg %p %p\n", temp, prev);
        printList(*list);
    
        free(temp);
    }
    

    【讨论】:

    • 你需要额外的间接级别,否则你无法删除列表中的第一个节点。
    • 您刚刚进行的添加if (temp == list)... 的更改并不能解决该问题。您正在更新局部变量list,而不是调用者的指针。他仍然会有一个指向现在被释放的节点的指针。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多