简体   繁体   English

为什么此链表出现段故障?

[英]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 . 您忘记设置newNodepreviousnext指针。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM