我有一小段代码,编译得很好。但它在运行时出现分段错误。
#include <stdlib.h>
#include <string.h>
typedef struct ListElmt_ // Define a structure for linked list elements.
{
void *data;
struct ListElmt_ *next;
} ListElmt;
typedef struct List_ //define a structure for linked lists.
{
int size; // the size of the linked list
ListElmt *head; // the head element
ListElmt *tail; // the tail elemtent
} List;
void list_init(List *l)
{
l->size = 0;
l->head = NULL;
l->tail = NULL;
}
int main()
{
List *ls = NULL;
list_init(ls);
return 0;
}
我试过但却找不到什么问题。请帮忙?我是新手,有人可以建议我找到这种错误的工具吗?
答案 0 :(得分:2)
你的失败路线是:
|
自从您将 l->size = 0;
初始化为ls
后,上述行正在执行NULL
,即非法取消引用。您需要先为NULL->size
分配内存。
但是,没有理由动态分配ls
。只需:
List
要找到问题的类型,你可以使用指针版本,你可以使用调试器并使用单步,即逐行执行代码,直到你遇到故障点。另一种方法是插入一些int main()
{
List ls; // Don't make list a pointer - just an ordinary var
list_init(&ls); // Pass the address of ls (i.e. &ls) as the function
// expects a pointer.
return 0;
}
语句,以便您可以看到代码在崩溃之前所执行的操作。
答案 1 :(得分:1)
在任何访问之前,应为变量ls
提供内存位置。
在使用ls = malloc(sizeof(List));
之前使用ls
。
尝试访问尚不存在的内存位置时,通常会出现分段错误。