2017-07-28 90 views
1

不工作,我有以下計劃,以C語言編寫的Structs預期用C

以下輸出我期待在前面加上一個值,我的尾巴是40,我的頭30後,但事實並非如此。

我是否在構造的內存分配時犯了錯誤,還是比那不明顯?

我在Mac OSX上使用GCC編譯器。

#include <stdio.h> 

struct LinkedListNode { 
    int data; 
    struct LinkedListNode *next; 
}; 

struct LinkedList { 
    int size; 
    struct LinkedListNode *head; 
    struct LinkedListNode *tail; 
}; 

struct LinkedList create_linked_list(){ 
    struct LinkedList linkedList; 

    linkedList.size = 0; 
    linkedList.head = NULL; 
    linkedList.tail = NULL; 

    return linkedList; 
} 

struct LinkedList prepend(struct LinkedList *linkedList, int data){ 
    struct LinkedListNode linkedListNode; 
    linkedListNode.data = data; 
    linkedListNode.next = linkedList->head; 

    linkedList->head = &linkedListNode; 

    if(linkedList->tail == NULL){ 
     printf("Setting tail to: %d\n", data); 
     linkedList->tail = &linkedListNode; 
    }else{ 
     printf("The tail is: %d\n", linkedList->tail->data); 
    } 

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

    return *linkedList; 
} 

int main(){ 
    struct LinkedList linkedList; 
    linkedList = create_linked_list(); 

    linkedList = prepend(&linkedList, 40); 

    struct LinkedListNode head = *linkedList.head; 
    struct LinkedListNode tail = *linkedList.tail; 

    printf("%d\n", head.data); 
    printf("%d\n", tail.data); 
    printf("%d\n", linkedList.size); 

    linkedList = prepend(&linkedList, 30); 

    head = *linkedList.head; 
    tail = *linkedList.tail; 

    printf("%d\n", head.data); 
    printf("%d\n", tail.data); 
    printf("%d\n", linkedList.size); 
} 

輸出:

Setting tail to: 40 
40 
40 
1 
The tail is: 30 
30 
30 
2 
+0

請不要更新您的問題以包含答案的結果。這是答案的目的。通過接受答案,你已經展示瞭如何解決你的問題 – Justin

回答

5

的一個主要問題是在這裏:

linkedList->head = &linkedListNode; 

在這裏你做出linkedList->head指向當地變量linkedListNode的位置。一旦函數返回,該變量就會超出範圍,並且指針將變爲指針指針,如果沒有undefined behavior,則不再可以解除引用。

此問題的解決方案是使用malloc動態分配LinkedListNode結構

+0

這是否會做到這一點? 'linkedListNode = *(struct LinkedListNode *)malloc(sizeof(linkedListNode));' –

+0

@JacobClark,'linkedListNode'必須是一個指針。你提供的代碼片段會將堆分配結構的內容複製到局部變量,這不是你想要的。 'linkedListNode = malloc(sizeof(LinkedListNode))'是你可能想要的。 – n0rd

+0

謝謝!用解決方案更新了我的問題。這是malloc :) –