所以我正在使用C来编写程序代码,它只执行基本的链表任务,比如创建列表,在给定的当前节点之后插入节点,删除节点等等。
我正在使用visual studio 2015,所以当我尝试通过调试我的insert-a-node-after函数并使用visual studio watch来查看我的列表以及它是否在当前节点之后正确插入节点时,我收到了错误:
chars.exe中0x011414CE处抛出异常:0xC0000005:访问冲突读取位置0x00000004。
chars.exe中0x011414CE处的未处理异常:0xC0000005:访问冲突读取位置0x00000004。
所以这是带有struct和list声明的.h文件
#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;
}
这是我的.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;
}
}
我发现了一些与我的问题相关的帖子,但所有这些帖子都没有定位链接列表或者不在C中。
那么有人可以帮我找到错误的位置吗?
提前致谢。
答案 0 :(得分:3)
您将NULL
传递给DListInsertAfter
作为list
,并且在您访问空指针时首先检查(list->head == NULL)
失败。
答案 1 :(得分:1)
Dlist之后收到一个NULL的列表
所以前进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;
}
答案 2 :(得分:0)
箭头操作符->
是用于解除引用并与struct成员访问相结合的语法糖。因此行
if (list->head == NULL) {
与
相同if ((*list).head == NULL) {
当您致电DListInsertAfter()
时,您会传入list
参数的指针,该参数初始化为NULL
。因此,您正在取消引用NULL
指针,这可能会导致您的崩溃。在尝试访问它之前,您需要在某个时刻为DList
结构分配内存。