>我有以下程序,以下输出是用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: %dn", data);
linkedList->tail = &linkedListNode;
}else{
printf("The tail is: %dn", 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("%dn", head.data);
printf("%dn", tail.data);
printf("%dn", linkedList.size);
linkedList = prepend(&linkedList, 30);
head = *linkedList.head;
tail = *linkedList.tail;
printf("%dn", head.data);
printf("%dn", tail.data);
printf("%dn", linkedList.size);
}
输出:
Setting tail to: 40
40
40
1
The tail is: 30
30
30
2
一个主要问题在这里:
linkedList->head = &linkedListNode;
在这里,您linkedList->head
指向局部变量的位置linkedListNode
。一旦函数返回,该变量将超出范围,指针将成为杂散指针,如果没有未定义的行为,您将无法再取消引用。
此问题的解决方案是使用malloc
动态分配LinkedListNode
结构。