【问题标题】:Why does this linked list Seg Fault?为什么这个链表会出现 Seg Fault?
【发布时间】:2016-12-20 10:37:30
【问题描述】:

如果在 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;
}

正在使用的列表是:

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;
}

【问题讨论】:

  • 调试器在哪里指出导致 seg 错误?
  • 我使用的是 C 编译器,所以它没有指定位置。对不起。
  • 您使用的是哪个操作系统,您能否提供一个显示该问题的最小可运行示例?一个糟糕的 mans 调试器就是在行之间插入 printf 语句,直到你可以看到哪个没有被打印出来
  • 开启警告! list *list = malloc(sizeof(list));:错误,list 未声明!
  • list *list = malloc(sizeof(list)); --> struct list *list = malloc(sizeof(struct list));

标签: c pointers linked-list


【解决方案1】:

您忘记设置newNode 的previous 和next 指针。 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多