如何找到分段错误的错误

时间:2016-09-19 03:15:57

标签: c

我有一小段代码,编译得很好。但它在运行时出现分段错误。

#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;

}

我试过但却找不到什么问题。请帮忙?我是新手,有人可以建议我找到这种错误的工具吗?

2 个答案:

答案 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

尝试访问尚不存在的内存位置时,通常会出现分段错误。