这是我的代码
Node* Node::createNode(int n)
{
Node newNode(n);
Node *temp = &newNode;
return temp;
}
void Node::printNode(Node* node)
{
cout << node->data << "\t" << node->next << endl;
system("pause");
}
这是主要功能
int main(int argc, char* argv[])
{
Node *head = Node::createNode(10);
Node::printNode(head);
return 0;
}
问题,我原本打算打印10.相反,我的垃圾值为-858993460。我注意到,直到这一点,参数传递给函数,它保留正确的值。但是在函数printNode中,值会发生变化。所以我觉得函数调用出了问题。任何帮助将不胜感激。
答案 0 :(得分:8)
您正在返回指向局部变量的指针。当你稍后在main函数中使用该指针时,它指向的变量早已消失,你进入了undefined behavior的领域。
您可以按值返回节点:
Node Node::createNode(int n)
{
Node newNode(n);
return newNode;
}
或者您可以动态分配一个并向其返回smart pointer,从而启用范围绑定资源管理(又称RAII):
std::unique_ptr<Node> Node::createNode(int n)
{
return std::unique_ptr<Node>(new Node(n));
}
答案 1 :(得分:2)
您正在Node
中返回指向本地作用域createNode
的指针。这是一个坏事(tm)。当该函数超出范围(即返回)时,谁知道你指向的内容会发生什么。
而是使用以下之一:
new Node
)并返回(首先使用智能指针)答案 2 :(得分:0)
你在创建节点的方式上有误:
Node* Node::createNode(int n)
{
Node newNode(n); // create a node on stack
Node *temp = &newNode; // get address of the node on stack
return temp; // return that address
} // and here the node is destructed!
您应该通过 operator new()在堆中分配它。
另请参阅Stack, Static, and Heap in C++和http://www.learncpp.com/cpp-tutorial/79-the-stack-and-the-heap/进行解释。
答案 3 :(得分:0)
您将返回对本地
的引用Node newNode(n);
Node *temp = &newNode;
return temp;
newNode超出范围,被后来的堆栈内容覆盖。
答案 4 :(得分:0)
在Node :: createNode()函数中,您将返回局部变量的地址。这是一个重大的失误。从函数返回后,Node对象的生命周期超出范围,它将从堆栈中弹出。