指向指针赋值的分段错误

时间:2015-10-06 03:12:12

标签: c pointers tree malloc

我正在实施huffman压缩,我正在从包含节点的链接列表构建一个hufftree。我在多次迭代后指向指向指针的指针上遇到分段错误。根据我的经验和研究,我认为分段错误是由于除程序中断之外的错误。任何帮助或建议都将受到高度赞赏。

P.S - 我是新的堆栈溢出,从来没有问过问题所以请告诉我你是否需要更多的信息来帮助我解决这个问题或其他任何问题。

struct LinkList{
    int weight;
    struct TreeNode * bottom;
    struct LinkList * next;
}; typedef struct LinkList LinkList;

//This function takes in a link list where each node points to the next
 //element in the link list and a huff tree node. It also contains weight 
//which is equal to the weight of the hufftree that it points to.

TreeNode * huffTree(LinkList * head)
{
    LinkList * temphead = head;
    LinkList * ptr;
    LinkList * ptr1;
    int count = 127,i;
    while(count>2)
    {
        temphead = head->next->next;
        head->next->next = NULL;
        head = mergeTree(head);
        ptr = temphead;
        ptr1 = temphead;// This is where I get the segmentation fault
//when the value of count is 14
        while(head->weight>temphead->weight)
        {
            ptr1 = temphead;
            temphead = temphead->next;
        }

        if(ptr1!=temphead)
        {
            head->next = temphead;
            ptr1->next = head;
            head = ptr;
        }

        else
        {
            head->next = temphead;
        }

        count--;
    }

    head = mergeTree(head);

    TreeNode * root;
    root = head->bottom;
    head->bottom = NULL;
    free(head);
    return root;
}

LinkList * mergeTree(LinkList * head)
{
    TreeNode * tree1 = head->bottom;
    TreeNode * tree2 = head->next->bottom;
    head->bottom = NULL;
    head->next->bottom = NULL;

    free(head->next);
    free(head);

    TreeNode * newnode = (TreeNode *) malloc(sizeof(TreeNode));

    newnode->weight = tree1->weight + tree2->weight;
    newnode->c = '~';
    newnode->left = tree1;
    newnode->right = tree2;

    LinkList * ptr = (LinkList *) malloc(sizeof(TreeNode));
    ptr->weight = newnode->weight;
    ptr->bottom = newnode;
    ptr->next = NULL;

    return ptr;
}

2 个答案:

答案 0 :(得分:0)

我的猜测是在声明"而(head-> weight> temphead-> weight){}"。 在遍历列表时,您尚未检查磁头是否已变为NULL。

答案 1 :(得分:0)

在你的“huffTree()”函数中,外部while循环(while(count> 2))运行127次迭代,因为count初始化为129。

因此,当调用者调用huffTree()时,输入列表(LinkList * head)必须有129个节点可用。

无论如何,如果列表的节点数少于129个,则应添加以下NULL条件处理。

temphead = head->next->next;
if (NULL == temphead)
{
    /* NULL condition handling */
}

当temphead == NULL时,temphead-> weight derefrencing将导致以下代码行中的分段错误

while(head->weight>temphead->weight)
如果确保malloc()在mergeTree()函数中不会失败,那么

head->权重就可以了。