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”来查看它是否可以打印任何内容,但是没有骰子。
如果有人需要查看更多代码,我很乐意提供它!
答案 0 :(得分:1)
在你的循环中,当你到达最后一个元素时,rowPoint
将被设置为NULL rowPoint = rowPoint->nextRow;
不幸的是,在下一个语句中检查它是否为空之前,你取消引用这个空指针:
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;
}
...
}
答案 1 :(得分:1)
rowPoint = rowPoint->nextRow;
point = rowPoint->firstInRow;
rowPoint
最终将返回nullptr
,而point
将使用该无效指针访问firstInRow
,这将使您的应用崩溃并且代码{{1}绝不会被执行。或许os << "0 0 0" << endl;
永远不会返回null(因此你的循环永远不会结束)。
解决方案:
nextRow