c-链表分配后的分段错误



我需要在程序中创建一个链表。在我的程序中,列表是用malloc()在堆上分配的,然后我试图访问它,但我遇到了分段错误;

编辑:我在这行得到SIGSEGV"while(!(node->nodeType==TYPE_END_LIST)){"

    struct dagNode *createList(int k);
    struct dagNode *newNodeXInterval(int type, int val);

    struct dagNode *createList(int k){
    struct dagNode *head, *node;
    printf("nList %d = ", k);
    head = newNodeXInterval(TYPE_EDGE_OR_GAP, getVal(k,1));
    node = head;
    int i;
    for (i=1; i<LENGTH_OF(k); i++){
            node->next = newNodeXInterval(TYPE_XTEST, getRightPointOf(k,i));
            node = node->next;
            node->next = newNodeXInterval(TYPE_EDGE_OR_GAP, getVal(k,i+1));
            node = node->next;
            }     
    node = newNodeXInterval(TYPE_END_LIST, 0);
    node = head;     // i think that here there is the error
    printf("%d", node->val); i=0;
                    while(!(node->nodeType == TYPE_END_LIST)){
                        printf("%d ", i);
                        node = node->next;}
    return head;}

    struct dagNode *newNodeXInterval(int type, int val){
        struct dagNode *node = (struct dagNode *) malloc(sizeof(struct dagNode));
        if (type == TYPE_EDGE_OR_GAP){
        *node = (struct dagNode) {(val<0)? TYPE_GAP:TYPE_EDGE, val, NULL, NULL, NULL};
        }
        else{
        *node = (struct dagNode) {type, val, NULL, NULL, NULL};
        }
        return node;    }

调用者函数将获得列表的头。

据我所知,问题出在行

node = newNodeXInterval(TYPE_END_LIST, 0);

在指定之前,node指向链表中的最后一个节点,上一个节点的next指针等于node。分配后,node指向类型为TYPE_END_LIST的新创建的节点,但前一个节点的next指针保持不变(即,它仍然保持node的原始值)。换句话说,新创建的节点不是列表的一部分,因此下面的while()循环中的条件node->nodeType == TYPE_END_LIST永远不会计算为true,并且当您超过列表的末尾时,您最终会取消引用空指针。将线路更改为

node->next = newNodeXInterval(TYPE_END_LIST,0);     

应该可以解决问题。

相关内容

  • 没有找到相关文章

最新更新