复制链表中的结构

在这里,我将结构从一个节点复制到另一个节点,但是当我遇到最后一个节点时,我将遇到分段错误,因为memcpy temp_clsf->next将指向一个无效的位置,我该如何解决这个问题呢? 我不能释放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; } 

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

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

只需在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; } 

在while中使用以下条件。

 while(temp_clsf->next!=NULL) 

可能, temp_clsf->next可能为NULL因此在memcpy之前移动NULL检查

 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正在memcpy指针的地址并覆盖那里的内容。 这是你的意图吗? 不确定sizeof(struct classifier)是什么,因为我们在您的示例中没有结构类型。

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

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