分段故障||访问冲突写入位置

时间:2012-11-13 03:52:27

标签: c++ linked-list segmentation-fault fault

我想在双向链表中插入一个Node。我通过了位置,多项式的新系数及其功效。我没有编译错误,但是当我用Visual Studio运行时,我在linux(g ++)中遇到了Segmentation错误,并且遇到了Access Violation Writing Location。

Program.exe中0x00bd20ba处的未处理异常:0xC0000005:访问冲突写入位置0xcdcdcdd9。

void Polynomial::insert( Term *pos, double newCoefficient, int power )
{
    Term *newTerm = new Term; // create a new node to insert

    // Link the new node to previous and next, given the position
    newTerm->prev = pos->prev;
    newTerm->next = pos;
    newTerm->prev->next = newTerm; // Here's where I'm getting the error
    newTerm->next->prev = newTerm;

    // change the coefficient and power
    newTerm->coefficient = newCoefficient;
    newTerm->power = power;
}

我做错了什么以及如何解决这个问题?

5 个答案:

答案 0 :(得分:1)

好吧,如果pos是第一个节点,那么pos->prev必须是NULL。在这种情况下,语句newTerm->prev->next = newTerm;会崩溃,因为没有NULL->next这样的东西!

您应该明确检查pos是否是列表中的第一个节点,并相应地放置newNode

// Link the new node to previous and next, given the position
newTerm->prev = pos->prev;
newTerm->next = pos;
if(pos->prev) newTerm->prev->next = newTerm;
newTerm->next->prev = newTerm;

答案 1 :(得分:1)

pos->prev可能为NULL或未初始化。您必须在使用之前验证输入...

答案 2 :(得分:0)

请检查在任何执行程序的实例中,pos是否可以是列表中的第一个节点。如果是,那么当您访问NULL指针的成员时,它将导致分段错误。

在编程时始终考虑极端情况,并确保已为其提供所需的条件。

答案 3 :(得分:0)

我想知道为什么你自己实施一个双向链表。您可以定义包含structclass成员的coefficientpower,并将其用作std::list的值类型。这将为您提供免费的大量列表操作(例如插入和删除元素)。作为奖励,std::list带有适当的迭代器(而不是位置指针),可用于标准算法。

由于缺少Polynomial类的其余部分(它是一个类,而不仅仅是命名空间,是吗?),很难提供更具体的帮助。

答案 4 :(得分:0)

当您尝试取消引用NULL指针时,通常会发生分段错误。

在处理指针时使用NULL检查被认为是一种好习惯。在这种情况下,似乎pos-> prev为NULL,导致分段错误。