c - 链表中的段错误

标签 c pointers linked-list segmentation-fault

编辑:Dijkstra 的回答是解决这个问题的方法。我的列表没有初始化为 NULL

我正在处理一个链表来存储一个唯一的单词列表,当我试图遍历该列表时会出现段错误。 Gdb 给我:

    Program received signal SIGSEGV, 
    Segmentation fault. 0x0000003a07e47ff7 in vfprintf () from /lib64/libc.so.6 
    Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.7.el6_0.5.x86_64

列表的插入代码是:

typedef struct L { char x[40] ; int occ; struct L *next ;} List;
List *insertList( char *in, List *l )
{
    List *t = calloc( 1, sizeof( List ) ) ;
    strcpy(t->x, in);
    t->occ = 1;
    t->next = l ;
    return t ;
}

void printList(List *l)
{
    List *l2 = l;
    while(l2)
    {
        printf("%s ", l2->x);
        l2 = l2->next;
    }
    return;
}

它循环遍历单词,将它们插入到链表中,貌似没问题。当我遍历列表以显示单词(大约 4200 个单词)时,大约 98%ish 会正常显示,然后它会在没有警告的情况下出现段错误。

通过更多的检查,它以与添加它们的顺序相反的顺序读回单词(这是有道理的)并且会在段错误之前到达列表末尾的第 5 个单词(添加的第 5 个单词)。我尝试调整插入函数以允许字符串长度超过 40 个字符,但在开头插入的单词(并被段错误)都在 20 个字符以下。

进一步挖掘,如果我在 printList 函数中 printf l2->next->next->next->next,插入的第一个单词就在那里。

谁能用这个给我指出正确的方向?

谢谢

最佳答案

gdb(或其他调试器,如果您不使用 linux)是我用来跟踪段错误的首选工具。使用调试符号编译代码并在调试器中运行它。当您崩溃时,请检查导致崩溃的线路。根据需要使用 backtrace 命令。遵循这些步骤几乎总能告诉我如何修复段错误。

关于c - 链表中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8843239/

相关文章:

Char指针存放int类型数据的地址

C如何判断一个char**占用多少内存

c++ - 寻找生产质量的哈希表/无序映射实现来学习?

c - Visualstudio.com 认为最新的 libgit2 已过时

c++ - 让我难过的基本指针算术

c - 链表中的所有节点都指向同一个对象

python - Python 的 List 是如何实现的?

python - 删除 Python 双链表中的节点时遇到问题

c - 与数组匹配结果段错误

c - 在 CUDA C 中使用 open() 时出错