Node* nodes[3];
for (Node* eachNode:nodes) {
eachNode = 0; //if i try to dereference it gives seg fault
} // eg. *eachNode = 0;
if (nodes[0] == 0) {
cout << "Null";
} else
cout << "Not null";
cout << 'n';
Node* nodes2[3];
for (int i = 0; i < 3; ++i) { //this way works fine
nodes2[i] = 0;
}
if (nodes2[0] == 0) {
cout << "Null";
} else
cout << "Not null";
嗨,伙计们,我正在努力使数组中的所有对象都等于null。当使用for循环时,它运行良好,但当我使用foreach循环时,会中断。
我得到的输出是
不为空
空
我想我必须取消引用foreach循环中的节点,但这会导致seg错误。
有人知道怎么了吗?谢谢
您在数组的值上编写的循环:
for (Node* eachNode:nodes) {
eachNode = 0;
}
上述循环也可以使用auto
:编写
for (auto eachNode:nodes) {
eachNode = 0;
}
上述循环的问题是eachNode
不是存储在数组中的指针,而是存储在循环的局部变量中的指针的副本。
如果您希望将节点设置为null,您需要对要将其设置的内存位置的引用。您可以通过使用auto&
:引用数组元素来获得该引用
for (auto& eachNode:nodes) {
eachNode = 0;
}
最后一个环节可能会达到你想要的效果。
我认为你应该试试:
for(Node *&eachNode : nodes) {
eachNode = nullptr;
}
通过这种方式,您可以获得与值相反的引用,并可以将其适当地设置为nullptr
。
我在C++11方面不是很有经验,但我确实在这里阅读了关于这个新范围构造的更多信息。
指针通过值传递。因此,设置eachNode = 0;
将更改该值,否则您将试图取消引用不是指针的对象。