我正在编写一个代码来制作链表。 为了在主函数中使链表更容易,我编写的函数之一是[node是一个struct的名称,接下来是a.data b.pointer name):
node& create_node(int value)
{
node newitem;
newitem.data=value;
newitem.next=NULL;
return (newitem);
};
当我写这样的函数时,一切都还可以,但我想把函数头写为:
node * create_node(int value)
但是当我这样写的时候我写了
return *newitem;
我收到错误。 我想问为什么VS在第二种方式中向我显示错误,使用*和&的区别是什么? [我已经在这里阅读了有关参考资料的内容,但我不明白为什么人们应该在函数中使用它,因为从我所理解的使用引用需要额外的空间而没有贡献]。
编辑:谢谢你的帮助,当我发布它之前,我甚至在主函数上运行测试之前只是试图避免编译前的错误。 我花了一些时间,但现在我看到了我犯的根本错误。
答案 0 :(得分:2)
如果要返回指针,则应使用指针:
node* create_node(int value)
{
node *newitem = new node;
newitem->data = value;
newitem->next = NULL;
return newitem;
};
另外请考虑谁将删除该对象。
答案 1 :(得分:1)
您的代码返回对变量的引用。
不幸的是,您返回对局部变量的引用。这将失败,因为局部变量将在uppont返回时被销毁,但调用者仍将尝试引用它(即UB)!
因此,如果要返回引用,则应确保该对象仍然存在:
node& create_node(int value) {
node* newitem = new node;
newitem->data=value;
newitem->next=NULL;
return (*newitem); // return the objet: this will be then be converted to a reference
}
您也可以按照其他答案的建议使用指针。但是在这种情况下,我会选择shared_ptr
:
shared_ptr<node> create_node(int value) {
node* newitem = new node;
newitem->data=value;
newitem->next=NULL;
return (shared_ptr<node>(newitem));
}
答案 2 :(得分:1)
你应该返回&amp; newitem。
但鉴于你的newitem只在这个函数的作用域中可用,返回的指针将指向一个被破坏的对象,所以“什么都没有”,或者说它会导致未定义的行为。
我想你想要动态创建你的newitem。
node * create_node(int value)
{
node * newitem = new node;
newitem->data=value;
newitem->next=NULL;
return newitem;
};