复制链表中的结构
在这里,我将结构从一个节点复制到另一个节点,但是当我遇到最后一个节点时,我将遇到分段错误,因为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_clsf
和temp_clsf->next
看起来像指针。 所以你的memcpy
正在memcpy
指针的地址并覆盖那里的内容。 这是你的意图吗? 不确定sizeof(struct classifier)
是什么,因为我们在您的示例中没有结构类型。
看起来你正在做一个项目的转移,可能会删除一个。 如果这是一个有序数组,则不需要使用next
指针。 我不确定您正在使用的其他静态分配,但您可以简单地执行以下操作来删除单个项目temp_clsf->next
:
temp_clsf->next=temp_clsf->next->next;