2016-09-23 2 views
0

以前NULL値が割り当てられていたポインタに新しい値を代入しようとすると、メモリの問題が発生します。私はその問題の解決にどのようにアプローチするかについてはあまりよく分かりません。新しい値にポインタを代入しようとするとメモリの問題が発生する

ここに私のコードです。これはリンクされたリストです。

typedef struct Node { 
    void* value; 
    struct Node* next; 
    struct Node* prev; 
} Node; 

typedef struct { 
    Node* head; 
    Node* tail; 
    int size; 
} LinkedList; 

LinkedList* createLinkedList() 
{ 
    LinkedList* linkedList; 

    /* Assign memory to LinkedList */ 
    linkedList = (LinkedList*) malloc(sizeof(LinkedList)); 

    /* Assign default LinkedList Attributes */ 
    linkedList->head = NULL; 
    linkedList->tail = NULL; 
    linkedList->size = 0; 

    return linkedList; 
} 

void insertFirst(LinkedList* linkedList, void* value) 
{ 
    Node* newNode; 
    Node* prevHead; 

    newNode = (Node*) malloc(sizeof(Node)); 

    prevHead = linkedList->head; 

    newNode->next = prevHead; 
    newNode->prev = NULL; 

    linkedList->head = newNode; 

    linkedList->head = newNode; 
    linkedList->size += 1; 

} 

主な機能は次のようになります。

int main(void) 
{ 
    linkedList = createLinkedList(); 
    insertFirst(linkedList, &testValue); 
    insertLast(linkedList, &testValue); 
    removeLast(linkedList); 
    deleteList(linkedList); 
} 

私はinsertFirstから、linkedList->head = newNodeを削除すると、プログラムはいかなる問題なく動作することを知っているが、明らかに私は新しいヘッド値にアクセスする能力を失います。 insertLastのほかに、上記を削除すると他のすべての機能が正しく動作します。その後、

Process terminating with default action of signal 11 (SIGSEGV) 
Access not within mapped region at address 0x10 

私の知識に私は、スタックの外の値にアクセスしようとしていますことを意味しているが、私は新しいノードのメモリを割り当てたと:

Valgrindのを実行している場合は、私が取得(?) linkedList->tailが新しいノードの場所に向いていることを示します。

私が以前に言ったように、私はこの問題にどのように近づくかについては確信していますので、どんな助けでも大いに感謝します。ありがとう。

+2

機能の使い方を教えていただけますか?あなたは[最小、完全で、検証可能な例](http://stackoverflow.com/help/mcve)を作成して私たちを見せてもらえますか? –

+0

ところで、あなたの 'insertFirst'関数では、非常に最初のノードを追加するときにリストテールポインタがどうなるか考えてみてください。 –

+0

もう少し情報を追加する – ReallyGoodPie

答えて

1

エラーは、コードがメモリ位置0x10(16)にアクセスしようとしている(読み取りまたは書き込みのいずれか)ことを意味します。これは確かにNULLポインタに基づくアクセスです。

malloc()が失敗した場合に発生する可能性があります。前のフィールド値または次のフィールド値を使用して成功したmalloc結果に割り当てることもできます。

+0

'createLinkedList()'の値をmalloc()してテストします。 – ReallyGoodPie

+0

ありがとうございます。これは問題を解決したようです。 – ReallyGoodPie

+0

回答受付前の制限時間 – ReallyGoodPie

関連する問題