以前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
が新しいノードの場所に向いていることを示します。
私が以前に言ったように、私はこの問題にどのように近づくかについては確信していますので、どんな助けでも大いに感謝します。ありがとう。
機能の使い方を教えていただけますか?あなたは[最小、完全で、検証可能な例](http://stackoverflow.com/help/mcve)を作成して私たちを見せてもらえますか? –
ところで、あなたの 'insertFirst'関数では、非常に最初のノードを追加するときにリストテールポインタがどうなるか考えてみてください。 –
もう少し情報を追加する – ReallyGoodPie