复制链表中的结构

时间:2011-05-10 09:53:44

标签: c

这里我将结构从一个节点复制到另一个节点但是当我遇到最后一个节点时,由于temp_clsf->next中的memcpy将指向无效位置,我将遇到分段错误,我该怎么办?解决这个问题?我不能免费temp_clsf因为它不是动态分配。

while(temp_clsf!=NULL)
{
    memcpy(&temp_clsf, &temp_clsf->next, sizeof(struct classifier));
    if(temp_clsf->next ==NULL)
        return;
    else
        temp_clsf = temp_clsf->next;
}

5 个答案:

答案 0 :(得分:1)

在循环内部,保留指向前一个节点的指针。循环结束时,使用指向NULL的指针更新该节点

/* pseudo-code */
while () {
    prev = curr;
    /* ... */
}
prev->next = NULL;

答案 1 :(得分:0)

只需在if ...

之后移动副本即可
 while(temp_clsf!=NULL)
    {
    if(temp_clsf->next ==NULL)
    return;
    //else
    memcpy(&temp_clsf, &temp_clsf->next, sizeof(struct classifier));
    temp_clsf = temp_clsf->next;
    }

答案 2 :(得分:0)

在while中使用以下条件。

while(temp_clsf->next!=NULL)     

答案 3 :(得分:0)

可能temp_clsf->next可能是NULL,因此请在NULL之前移动memcpy

while(temp_clsf != NULL)
{
    if(temp_clsf->next == NULL)
    {
        return;
    }

    memcpy(&temp_clsf, &temp_clsf->next, sizeof(struct classifier));

    temp_clsf = temp_clsf->next;
}

更新temp_clsftemp_clsf->next看起来像指针。所以你的memcpy正在接收指针并覆盖那些指针。这是你的意图吗?不确定sizeof(struct classifier)是什么,因为我们在您的示例中没有结构类型。

答案 4 :(得分:0)

看起来您正在进行项目转移,可能会删除一项。如果这是一个有序数组,则不需要使用next指针。我不确定您使用的其他静态分配,但您只需执行以下操作即可删除单个项temp_clsf->next

temp_clsf->next=temp_clsf->next->next;