C 无法将第二个元素插入链表|指向函数的指针已损坏

C 无法将第二个元素插入链表|指向函数的指针已损坏,c,linked-list,C,Linked List,以下是相关代码: typedef struct Node_t { ListElement data; struct Node_t* next; } Node; struct List_t { Node* head; Node* tail; Node* current; int size; CopyListElement copyF; FreeListElement freeF; }; 在main函数中,我正在尝试: Li

以下是相关代码:

typedef struct Node_t {
    ListElement data;
    struct Node_t* next;
} Node;

struct List_t {
    Node* head;
    Node* tail;
    Node* current;
    int size;
    CopyListElement copyF;
    FreeListElement freeF;
};




在main函数中,我正在尝试:

List list = listCreate(&copyInt, &freeInt);

ListResult result;
int el=2;
//ListElement e1;
//ListElement e2;

result = listInsertFirst(list,&el);
printf("\nresult = %d\n", result);

result = listInsertFirst(list,&el);
printf("\nresult = %d\n", result);

编译并运行后,我得到:

首先输入listInsertFirst

输入初始化节点

在initializeNode内,在copyF之前

在initializeNode内,在copyF之后

initializeNode中的最后一行

节点已初始化

在listInsertFirst中输入物流工作

元素已成功插入

检查列表->listInsertFirst分段错误中的CopyF:11


由于某种原因,指针[to函数]列表-> Copf被损坏[Sim]。

< P>我假设这是C代码,而不是C++,基于标签。考虑到数据定义和实际代码语句的混合(我不希望在C中使用),我不能100%确定它是真正的C,在这种情况下,我可能对下面的错误是错误的

首先,
initializeNode()
的接口没有达到您可能想要的效果。您可能想要:

static ListResult initializeNode(List list, ListElement element, Node** newNodep)
{
    Node *newNode = malloc(sizeof(Node));
    if (newNode == NULL) return LIST_OUT_OF_MEMORY;
    ListElement newElement = list->copyF(element);
    if (newElement == NULL) return LIST_OUT_OF_MEMORY;
    newNode->data = newElement;
    *newNodep = newNode;
    return LIST_SUCCESS;
}
这样,您创建的节点就会传回

我不知道
CopyInt()
做了什么,但是如果真的是函数碰到了总线错误,
initializeNode()的错误不可能是你的问题。但是,在报告崩溃之前,您可能没有看到所有printf的输出

如果
CopyInt()
实现了我所期望的功能,它会执行以下操作:

ListElement CopyInt(int *val)
{
    ListElement *e = malloc(sizeof(ListElement));
    if (e) 
        e->val = *val;
    return e;
}

这里出现第二次总线错误的唯一方法是将库函数
malloc()
维护的数据结构弄乱。不幸的是,对于这个理论,我没有看到比内存泄漏更糟糕的事情

我猜真正导致崩溃的bug是这一行:

newNode->next=list->head

就像@Arlie Stephens所说的那样,
initializeNode的代码没有任何作用,因为指针是通过值传递的,而实际指针仍然指向垃圾。所以当你做
newNode->next=list->head你基本上是在写一个未知的地址,很可能会出现分段错误。
为什么只在第二次通话时发生?不知道,这是未定义的行为


疯狂的想法-可能是newNode->next被初始化为copyF的地址,并试图写入其中导致您损坏copyF…尝试打印newNode->next的地址和copyF的地址。

谢谢您的回答,我需要一些时间来分析它。顺便说一句,这是C99.initializeNode获取一个指向节点的指针,所以我不认为您对initializeNode的修复是“好的”。您使用的编译器标志是什么?我要尝试的第一件事是添加-Wall-Wextra。还有,你试过Valgrind吗?
List list = listCreate(&copyInt, &freeInt);

ListResult result;
int el=2;
//ListElement e1;
//ListElement e2;

result = listInsertFirst(list,&el);
printf("\nresult = %d\n", result);

result = listInsertFirst(list,&el);
printf("\nresult = %d\n", result);
static ListResult initializeNode(List list, ListElement element, Node** newNodep)
{
    Node *newNode = malloc(sizeof(Node));
    if (newNode == NULL) return LIST_OUT_OF_MEMORY;
    ListElement newElement = list->copyF(element);
    if (newElement == NULL) return LIST_OUT_OF_MEMORY;
    newNode->data = newElement;
    *newNodep = newNode;
    return LIST_SUCCESS;
}
ListElement CopyInt(int *val)
{
    ListElement *e = malloc(sizeof(ListElement));
    if (e) 
        e->val = *val;
    return e;
}