我在C中用Xcode编写链表。 实际上我可以将第一个节点附加到列表中。一切都运行良好。 但是,当我将第二个追加到列表中时,Xcode在malloc()一行显示一个新节点的EXC_BAD_ACCESS错误。 我知道这个错误是由访问NULL指针引起的,但是我找不到哪里出错了。 这是我的代码的一部分。
SinglyLinkedList.c:
void llist_node_append(SList *ptr, const void *datap)
{
struct llist *me = ptr;
struct node *newnodep;
newnodep = malloc(sizeof(struct node));
if (newnodep == NULL)
FatalError("No space to append new node.\n");
newnodep->datap = malloc(sizeof(me->elemsize));
if (newnodep->datap == NULL)
FatalError("No space to append new node.\n");
memcpy(newnodep->datap, datap, me->elemsize);
newnodep->next = NULL;
me->last->next = newnodep;
me->last = newnodep;
if (llist_is_empty(me))
me->head->next = newnodep;
}
void llist_travel(SList *ptr, node_proc_fun_t *proc)
{
struct llist *me = ptr;
struct node *curr;
for (curr = me->head.next; curr != NULL; curr = curr->next) {
proc(curr->datap);
}
}
main.c中:
struct node {
void *datap;
struct node *next;
};
struct llist {
struct node *head;
struct node *last;
int elemsize;
};
typedef struct food_list {
char breakfast[20];
char lunch[20];
char dinner[20];
} FoodList;
void llist_print(void* elem)
{
FoodList *temp = elem;
printf("the breakfast is %s\nthe lunch is %s\nthe dinner is %s\n", temp->breakfast, temp->lunch, temp->dinner);
}
int main()
{
SList list = *llist_new(sizeof(FoodList));
FoodList UCSB = {
"milk and bread",
"beef",
"burger",
};
FoodList UCB = {
"apple",
"juice",
"eggs",
};
llist_node_append(&list, &UCSB);
llist_node_append(&list, &UCB);
llist_travel(&list, llist_print);
return 0;
}