为什么我的重载<<运算符没有输出最后一行?


ostream& operator<< (ostream& os,SparseMatrix& m)
{
RowNode* rowPoint = m.rowFront;
Node* point = rowPoint->firstInRow;

while(rowPoint != NULL)
    {
    while (point != NULL)
        {
        os << point->row;
        os << ' ';
        os << point->column;
        os << ' ';
        os << point->data;
        os << endl;
        point = point->right; 
        }
    rowPoint = rowPoint->nextRow;
    point = rowPoint->firstInRow;
    }
os << "0 0 0" << endl;
return os;
}

当我尝试在我的程序中运行它时,列表完全正确,但最后的"0 0 0"行从未出现。我尝试以不同的方式格式化它,将其放在较大的 while 循环末尾的 if 语句中,我什至尝试输出一堆不仅仅是"0 0 0",看看它是否可以打印任何东西,但没有骰子。

如果有人需要查看更多代码,我很乐意提供!

在你的循环中,当你到达最后一个元素时,rowPoint将被设置为 NULL,并带有rowPoint = rowPoint->nextRow;

不幸的是,在检查它是否为 NULL 之前,您在下一条语句中取消引用此空指针:

point = rowPoint->firstInRow;

这会导致 UB。

要解决它,请稍微更改您的代码:

ostream& operator<< (ostream& os,SparseMatrix& m)
{
RowNode* rowPoint = m.rowFront;
while(rowPoint != NULL)
    {
    Node* point = rowPoint->firstInRow;  // here you're sure not to dereference NULL ptr
    while (point != NULL)
        {
        ...
        point = point->right; 
        }
    rowPoint = rowPoint->nextRow;
    }
...
}
rowPoint = rowPoint->nextRow;
point = rowPoint->firstInRow;

rowPoint最终会返回一个nullptrpoint会使用该无效的指针来访问firstInRow,这将使你的应用崩溃,代码os << "0 0 0" << endl;永远不会被执行。或者也许nextRow永远不会返回 null(因此您的循环永远不会结束)。

溶液:

while (rowPoint != NULL)
{
    point  = rowPoint->firstInRow;
    while (point != NULL)
    {
        os << point->row;
        os << ' ';
        os << point->column;
        os << ' ';
        os << point->data;
        os << endl;
        point = point->right;
    }
    rowPoint = rowPoint->nextRow;
}

相关内容

  • 没有找到相关文章

最新更新