2017-07-28 71 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 :) –