在C中发生分段故障但处理空案例

时间:2014-02-25 15:27:41

标签: c

我正在尝试以最有效的方式在C中创建一个已排序的linked_list存储库。链表将存储包含“key”和“data”值的数据记录。链表应保持按键排序的记录。示例链接列表看起来像{1,5},{3,8},{4,7}。链表保持记录按键排序。

我有一个名为“invert”的函数,只有当列表中不存在具有相同键值的记录时才会向列表中添加值。如果在列表中找到密钥,则应删除该记录。我已经拥有了所有这些的功能代码,但现在我正在尝试提高它的效率,所以我修改了我的代码以减少程序的迭代次数。出于某种原因,在我的新代码中,我遇到了分段错误。此外,当我将print语句添加到debug时,除非我将新行字符添加到语句的末尾,否则不会打印print语句。这是代码:

    node *pnode;
    printf("made pnode\n");
    node *delTemp;
    printf("made delTemp\n");
    node *travTemp;
    printf("made travTemp\n");

    travTemp = &sentinel; //sentinel is an empty node that is always
    // present in the linked list but is not an actual record. It is just there
    // to make insert and deletion easier

    while((travTemp->next)!=NULL && (travTemp->next->key)<key){
        printf("inside while loop\n");

        travTemp = travTemp->next;

    }

    if((travTemp->next->key)==key){
       printf("deleting\n");
       delTemp = travTemp->next;
       travTemp->next = delTemp->next;
       free(delTemp);
       return 0;
    }
    printf("outside while loop \n");
    pnode = malloc(sizeof(node));
    pnode->data = data;
    pnode->key = key;
    pnode->next = travTemp->next;
    travTemp->next = pnode;
    return 1;

出于某种原因,“while while loop”和“while while loop”都不会打印。我写了一个快速if语句来查看travTemp-&gt; next是否为null,它应该在程序的开头。但是,在这种情况下,它应该仍然打印“外循环”不应该吗?我对于发生分段错误的位置感到非常困惑。在此先感谢您的帮助。另外,有没有人解释为什么除非我在其中添加“\ n”,否则代码最开头的打印语句不会打印出来?

此外,哨兵的定义如下:

    node sentinel;
    void Repository_init(){
       sentinel.data = -1;
       sentinel.next = NULL;
       sentinel.key = -1;
    }

在main()中调用Repository_init()没有问题。

编辑: 我使用了一个调试器,发现seg错误出现在语句“if((travTemp-&gt; next-&gt; key)== key)”。我可以理解为什么会在程序开始时发生这种情况,但我不确定如何克服这个问题。在if语句周围放置一个if语句来检查travTemp是不是NULL似乎是多余的。

1 个答案:

答案 0 :(得分:1)

由于

而发生分段错误
if((travTemp->next->key)==key){

何时

travTemp->next == NULL

在这种情况下,无论是在循环内还是在外面打印,都不会打印。