2016-09-29 4 views
0

Cを使用してプログラムを作成するだけで、リストの作成、指定された現在のノードの挿入ノード、ノードなどを削除します。chars.exeの0x011414CEでスローされた例外:0xC0000005:アクセス違反の読み取り場所0x00000004

私はビジュアルスタジオ2015を使用していますので、デバッグしてビジュアルスタジオウォッチを使用してインサートノード後の機能をテストしようとしました。

chars.exeの0x011414CEで例外がスローされました:0xC0000005:0x00000004のアクセス違反を読み取るアクセス違反です。現在のノードの後ろにノードが正しく挿入されています。

chars.exeの0x011414CEで未処理の例外が発生しました。0xC0000005:0x00000004という場所を読み取るアクセス違反。だからここ

はので、ここで

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

されており、ここで私は私のinsertafter機能を持っている私の.cファイルで構造体とリストの宣言と私の.hファイルであります

#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

デバッガは、segフォールトをトリガしているコード行を正確に伝える必要があります。それを最低限提供してください。デバッガをより効果的に使用する方法を学ぶことは貴重な時間です。 – kaylum

答えて

3

NULLDListInsertAfterに、listとし、ヌルポインタにアクセスすると、最初のチェック(list->head == NULL)が失敗します。

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

Markdownでコード行を太字にしようとしたと思います。あなたはそれを行うことはできませんので、今あなたはアスタリスクの笑で喜んでいるようです –

+0

Ooops 私は彼の質問に答えるために急いでいた しかし、私はそれを行う前にいくつかの他の人が答えたようだ:D –

0

矢印演算子->は、構造体メンバーアクセスと組み合わされた逆参照用の構文砂糖です。したがって、ライン

if (list->head == NULL) { 

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

あなたがDListInsertAfter()を呼び出すと、あなたがNULLに初期化されるlistパラメータのポインタを渡すと同じです。したがって、NULLポインタの参照を解除している可能性があります。ある時点で、DList構造体にメモリを割り当てる必要があります。

関連する問題