[英]Why does this linked list Seg Fault?
The following code results in a segmentation fault if insertBefore is called after insertAfter or if insertAfter is called multiple times. 如果在insertAfter之后调用insertBefore或多次调用insertAfter,以下代码将导致分段错误。
void insertBefore(list *l, void *p){
node* newNode = malloc(sizeof(node) + l->SizeOfData);
memcpy(newNode->item, p, l->SizeofData);
l->curent->previous->next = newNode;
l->current->previous = newNode;
}
void insertAfter(list *l, void *p){
node* newNode = malloc(sizeof(node) + l->SizeOfData);
memcpy(newNode->item, p, l->SizeofData);
l->curent->next->previous = newNode;
l->current->previous->next = newNode;
l->current = newNode;
}
The lists being used are: 使用的列表是:
struct node {
struct node *previous;
struct node *next;
char item[];
};
typedef struct node node;
struct list {
node *first;
node *current;
node *last;
int SizeOfData;
};
list *newList(int b) {
list *list = malloc(sizeof(list));
node *sentnode = malloc(sizeof(node));
sentnode->previous = sentnode;
sentnode->next = sentnode;
list->first = sentnode;
list->current = sentnode;
list->last = sentnode;
list->SizeOfData = b;
return list;
}
You forgot to set the previous
and next
pointers of newNode
. 您忘记设置newNode
的previous
和next
指针。 There is also another bug in insertAfter
(changed line). insertAfter
(更改的行)中还有另一个错误。
void insertBefore(list *l, void *p){
node* newNode = malloc(sizeof(node) + l->SizeOfData);
memcpy(newNode->item, p, l->SizeofData);
newNode->previous = l->current->previous; // Added line
newNode->next = l->current; // Added line
l->current->previous->next = newNode;
l->current->previous = newNode;
}
void insertAfter(list *l, void *p){
node* newNode = malloc(sizeof(node) + l->SizeOfData);
memcpy(newNode->item, p, l->SizeofData);
newNode->previous = l->current; // Added line
newNode->next = l->current->next; // Added line
l->current->next->previous = newNode;
l->current->next = newNode; // Changed line
l->current = newNode;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.