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

时间:2016-09-29 22:37:20

标签: c pointers memory doubly-linked-list

所以我正在使用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中。

那么有人可以帮我找到错误的位置吗?

提前致谢。

3 个答案:

答案 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结构分配内存。