malloc()在xcode中的链表中插入新节点时导致exc_bad_access

时间:2014-10-26 00:38:58

标签: c xcode linked-list exc-bad-access

我在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;
}

0 个答案:

没有答案