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
最终会返回一个nullptr
,point
会使用该无效的指针来访问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;
}