返回指针时出现分段错误[关闭]
Posted
技术标签:
【中文标题】返回指针时出现分段错误[关闭]【英文标题】:Segmentation fault while returning a pointer [closed] 【发布时间】:2016-07-13 18:56:16 【问题描述】:所以这是将新元素插入到链表中的代码。它需要第一个节点的地址和要插入的整数数据。但是当我返回第一个节点的地址时,我得到了 Segfault。我读过其他类似的问题,但 OP 正在返回一个指向局部变量的指针。在这里,我实际上是在返回一个本地指针。
struct Node
int data;
struct Node *next;
Node* Insert(Node *head,int data)
Node* temp=head;
Node* return_value=temp;
cout<<head<<" ";
while(temp!=NULL && temp->next!=NULL)
temp=temp->next;
Node new_obj;
if(temp==NULL)
temp=&new_obj;
temp->data=data;
cout<<temp<<" "<<temp->data<<" ";
return(temp);
【问题讨论】:
甚至不编译。 您正在返回 new_obj 的地址,该地址在调用 Insert() 后不再存在 谢谢。但是我如何返回新地址?因为如果列表为空,创建一个新对象似乎是唯一的方法。 C 和 C++ 是不同的语言,解决问题的可能方法取决于您使用的语言。显然那是C++。编辑你的标签。 【参考方案1】:Node new_obj
在栈上创建一个对象,而不是堆上。当Insert
退出时,该对象不再存在。你想要temp = new Node;
而不是temp=&new_obj;
。
编辑另外,如果列表非空,您的while
循环将使temp
指向列表的非NULL 最后一个节点。因此,您实际上不会分配新节点,因为if(temp==NULL)
检查将失败!
编辑 2 return temp;
就是这样。要修复段错误,只需更改新节点的创建即可。对于while
错误,有很多方法可以修复它。一种选择是查找有关列表的“标题节点”的信息。另一种是先测试head==NULL
,然后单独处理。
【讨论】:
我真是太愚蠢了。我完全忽略了那部分。非常感谢。但是,如果我想返回创建的新节点的地址,我该怎么做呢?此外,这只是针对空列表情况的程序的一半。 @JayParkeh,在这种情况下,请务必执行以下操作:(1)接受答案。 (2) 编辑您问题的代码,以便它可以编译。谢谢 @JayParekh 很高兴为您提供帮助!根据您的评论编辑答案。如果这个答案解决了您的问题,请您点击复选标记接受它,正如 user3078414 指出的那样?有关流程的更多信息,请参阅tour。当您接受时,该问题将从“未回答”列表中删除,我们都将获得声望分 :) 嗨!接受了你的回答。所以关于段错误,我没有创建一个新对象,而是为 temp 做了一个 malloc 并返回它。有效。感谢有关循环的帮助,但就像我说的,它只是整个程序的一部分。抱歉,这是我在 SE 的第一天,我一定会参观。再次感谢。 @JayParekhmalloc
将起作用。但是,由于您使用 C++,请允许我强烈建议切换到 new
和 delete
而不是 malloc
和 free
。使用new
/delete
意味着您不必进行类型转换,编译器可以为您找到更多错误。另外,你不能malloc
一个类,[1] 所以现在学习new
/delete
将为你开始使用面向对象编程铺平道路。 [注 1] 是的,C++ 专家,出于此评论的目的,我忽略了位置 new
。你不会代替我吗? ;)以上是关于返回指针时出现分段错误[关闭]的主要内容,如果未能解决你的问题,请参考以下文章