chars.exe中0x011414CE处引发异常:0xC0000005:访问冲突读取位置0x00000004

chars.exe中0x011414CE处引发异常:0xC0000005:访问冲突读取位置0x00000004,c,pointers,memory,doubly-linked-list,C,Pointers,Memory,Doubly Linked List,因此,我正在为一个使用C语言的程序编写代码,该程序只执行基本的链表任务,如创建列表、在给定的当前节点后插入节点、删除节点等 我使用的是visual studio 2015,因此,当我试图通过调试并使用visual studio watch可视化我的列表以及它是否正确地在当前节点后插入节点来测试我的insert-a-node-after函数时,我遇到了错误: 在chars.exe中的0x011414CE处引发异常:0xC0000005:访问冲突读取位置0x00000004 chars.exe中0x

因此,我正在为一个使用C语言的程序编写代码,该程序只执行基本的链表任务,如创建列表、在给定的当前节点后插入节点、删除节点等

我使用的是visual studio 2015,因此,当我试图通过调试并使用visual studio watch可视化我的列表以及它是否正确地在当前节点后插入节点来测试我的insert-a-node-after函数时,我遇到了错误:

在chars.exe中的0x011414CE处引发异常:0xC0000005:访问冲突读取位置0x00000004

chars.exe中0x011414CE处的未处理异常:0xC0000005:访问冲突读取位置0x00000004

下面是我的.h文件,其中包含struct和list声明

#ifndef DLIST_H
#define DLIST_H


typedef struct DListNode_struct {
char *str;
int blankIndex;
int blankLength;
struct DListNode_struct *next;
struct DListNode_struct *prev;
} DListNode;

typedef struct DList_struct {
   int size;
   DListNode *head;
   DListNode *tail;
} DList;


void DListConstruct(DList* list);

void DListInsertAfter(DList* list, DListNode* currNode, DListNode* newNode);

#endif // DLIST_H
这是我的主要功能

#include <stdio.h>
#include <stdlib.h>
#include "dlist.h"

int main() {

DList* list = NULL;
DListNode* currNode = NULL;

DListNode* newNode1 = (DListNode*)malloc(sizeof(DListNode));

DListInsertAfter(list, currNode, newNode1);



return 0;
}
#包括
#包括
#包括“dlist.h”
int main(){
DList*list=NULL;
DListNode*currNode=NULL;
DListNode*newNode1=(DListNode*)malloc(sizeof(DListNode));
DListInsertAfter(列表、currNode、newNode1);
返回0;
}
这是我的.c文件,其中有insertafter函数

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dlist.h"


void DListConstruct(DList* list) {

list->head = NULL;
list->tail = NULL;
list->size = 0;

}



void DListInsertAfter(DList* list, DListNode* currNode, DListNode* newNode) {

DListNode* sucNode;

if (list->head == NULL) {
    list->head = newNode;
    list->tail = newNode;
}

else if (currNode == list->tail) {
    list->tail->next = newNode;
    newNode->prev = list->tail;
    list->tail = newNode;
}

else {
    sucNode = currNode->next;
    newNode->next = sucNode;
    newNode->prev = currNode;
    currNode->next = newNode;
    sucNode->prev = newNode;
}
}
#包括
#包括
#包括
#包括“dlist.h”
无效数据列表构造(数据列表*列表){
list->head=NULL;
list->tail=NULL;
列表->大小=0;
}
void DListInsertAfter(DList*列表、DListNode*currNode、DListNode*newNode){
DListNode*sucNode;
如果(列表->标题==NULL){
list->head=newNode;
list->tail=newNode;
}
else if(currNode==列表->尾部){
列表->尾部->下一步=新节点;
新建节点->上一个=列表->尾部;
list->tail=newNode;
}
否则{
sucNode=currNode->next;
newNode->next=sucNode;
newNode->prev=currNode;
currNode->next=newNode;
sucNode->prev=newNode;
}
}
我发现了一些与我的问题相关的帖子,但它们要么不是针对链表,要么不是C语言

有人能帮我找到bug在哪里吗


提前谢谢

您正在将
NULL
作为
list
传递给
DListInsertAfter
并在访问NULL指针时首先检查
(list->head==NULL)
失败

您正在将
NULL
作为
list
传递给
DListInsertAfter
并在访问NULL指针时首先检查
(list->head==NULL)
失败

Dlist-after接收到一个空列表 因此,问题在于如何使用
list->head
。因为它不存在

您需要首先分配列表

#include <stdio.h>
#include <stdlib.h>
#include "dlist.h"

int main() {

DList* list = NULL;
DListNode* currNode = NULL;

DListNode* newNode1 = (DListNode*)malloc(sizeof(DListNode));

DList* list = (void*)malloc(sizeof(DList));

DListInsertAfter(list, currNode, newNode1);



return 0;
}
#包括
#包括
#包括“dlist.h”
int main(){
DList*list=NULL;
DListNode*currNode=NULL;
DListNode*newNode1=(DListNode*)malloc(sizeof(DListNode));
DList*list=(void*)malloc(sizeof(DList));
DListInsertAfter(列表、currNode、newNode1);
返回0;
}

d收到空列表后的列表 因此,问题在于如何使用
list->head
。因为它不存在

您需要首先分配列表

#include <stdio.h>
#include <stdlib.h>
#include "dlist.h"

int main() {

DList* list = NULL;
DListNode* currNode = NULL;

DListNode* newNode1 = (DListNode*)malloc(sizeof(DListNode));

DList* list = (void*)malloc(sizeof(DList));

DListInsertAfter(list, currNode, newNode1);



return 0;
}
#包括
#包括
#包括“dlist.h”
int main(){
DList*list=NULL;
DListNode*currNode=NULL;
DListNode*newNode1=(DListNode*)malloc(sizeof(DListNode));
DList*list=(void*)malloc(sizeof(DList));
DListInsertAfter(列表、currNode、newNode1);
返回0;
}

箭头操作符
->
是与结构成员访问相结合的解除引用的语法糖。所以这条线

if (list->head == NULL) {

if ((*list).head == NULL) {

调用
DListInsertAfter()
时,将传递初始化为
NULL
列表
参数的指针。因此,您正在取消对
NULL
指针的引用,这可能会导致崩溃。在尝试访问结构之前,您需要在某个时候为
DList
结构分配内存。

箭头运算符
->
是与结构成员访问相结合的解除引用的语法糖。所以这条线

if (list->head == NULL) {

if ((*list).head == NULL) {

调用
DListInsertAfter()
时,将传递初始化为
NULL
列表
参数的指针。因此,您正在取消对
NULL
指针的引用,这可能会导致崩溃。在尝试访问
DList
结构之前,您需要在某个时候为它分配内存。

调试器应该准确地告诉您哪行代码触发了seg故障。请至少提供这一点。学习更有效地使用调试器是值得的。调试器应该准确地告诉您哪行代码触发seg故障。请至少提供这一点。学习更有效地使用调试器是值得的;你不能这么做,所以现在看起来你对星号有点兴奋哈哈…哦,我很想回答他的问题,但似乎其他人在我回答之前就回答了:我想你试图在降价时加粗一行代码;你不能这么做,所以现在看起来你对星号有点兴奋哈哈…哦,我很想回答他的问题,但似乎其他人在我回答之前就回答了:D