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(©Int, &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(©Int, &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;
}