我一直收到此分段错误:11错误,我不知道为什么。
我的代码:
typedef struct Node* NodePtr;
struct Node
{
NodePtr next;
void *val;
};
struct List
{
NodePtr head;
};
typedef struct List* ListPtr;
int compare(void *one, void *two)
{
if(*(int*)one < *(int*)two)
return -1;
else if(*(int*)one > *(int*)two)
return 1;
return 0;
}
ListPtr create()
{
ListPtr blah = malloc(sizeof(struct List));
memset(blah, 0, sizeof(struct List));
return blah;
}
NodePtr scan(NodePtr head, void *obj)
{
NodePtr previous, current;
previous = head;
current = head->next; // Segmentation fault here!!
while(current != NULL && (compare(curry->val, obj) == -1))
{
previous = current;
current = current->next;
}
return previous;
}
int insert(ListPtr llist, void *obj)
{
NodePtr newobj = malloc(sizeof(struct Node));
NodePtr prevNode, nextNode;
prevNode = search(llist->head, obj);
nextNode = prevNode->next;
if((nextNode == NULL) || (compare(nextNode->val, obj) != 0))
{
prevNode->next = newobj;
newobj->next = nextNode;
return 1;
}
else
{
free(newobj);
}
return 0;
}
我认为head
未分配,因此我在malloc
创建了blah->head
,但仍然没有运气。
我认为在调试之后错误就在这里:current = head->next
。
任何帮助将不胜感激!谢谢你的时间!
编辑:我如何调用insert:
int main(int argc, char *argv[])
{
ListPtr list = create();
int x = 2;
int *p = &x;
while(*p != 0)
{
printf("\nEnter a number: ");
scanf("%d", p);
if(*p != 0)
insert(list, p);
}
return 0;
}
答案 0 :(得分:1)
扫描时,您似乎无法检查列表是否为空。但是,如果没有告诉我们您如何调用该函数的最小完全可验证示例,则无法确定您所执行的操作。
现在你有了,似乎就是这样。您创建一个空列表并在插入函数中搜索它。搜索功能取消引用head
中的归零指针,导致段错误。
请尝试以下操作:首先,在对其执行任何操作之前,检查指针在每个函数中是否有效。每个搜索都会失败一个空列表。其次,为了获得最大的可移植性,您希望将head
指针设置为NULL
(因为NULL
指针在所有实现中都不一定是全位 - 零。)