返回指针时出现分段错误[关闭]

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=&amp;new_obj;

编辑另外,如果列表非空,您的while 循环将使temp 指向列表的非NULL 最后一个节点。因此,您实际上不会分配新节点,因为if(temp==NULL) 检查将失败!

编辑 2 return temp; 就是这样。要修复段错误,只需更改新节点的创建即可。对于while 错误,有很多方法可以修复它。一种选择是查找有关列表的“标题节点”的信息。另一种是先测试head==NULL,然后单独处理。

【讨论】:

我真是太愚蠢了。我完全忽略了那部分。非常感谢。但是,如果我想返回创建的新节点的地址,我该怎么做呢?此外,这只是针对空列表情况的程序的一半。 @JayParkeh,在这种情况下,请务必执行以下操作:(1)接受答案。 (2) 编辑您问题的代码,以便它可以编译。谢谢 @JayParekh 很高兴为您提供帮助!根据您的评论编辑答案。如果这个答案解决了您的问题,请您点击复选标记接受它,正如 user3078414 指出的那样?有关流程的更多信息,请参阅tour。当您接受时,该问题将从“未回答”列表中删除,我们都将获得声望分 :) 嗨!接受了你的回答。所以关于段错误,我没有创建一个新对象,而是为 temp 做了一个 malloc 并返回它。有效。感谢有关循环的帮助,但就像我说的,它只是整个程序的一部分。抱歉,这是我在 SE 的第一天,我一定会参观。再次感谢。 @JayParekh malloc 将起作用。但是,由于您使用 C++,请允许我强烈建议切换到 newdelete 而不是 mallocfree。使用new/delete 意味着您不必进行类型转换,编译器可以为您找到更多错误。另外,你不能malloc 一个类,[1] 所以现在学习new/delete 将为你开始使用面向对象编程铺平道路。 [注 1] 是的,C++ 专家,出于此评论的目的,我忽略了位置 new。你不会代替我吗? ;)

以上是关于返回指针时出现分段错误[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

尝试从方法返回指向对象的指针时出现分段错误

返回指针时出现分段错误

在 C++ 中使用指针的数组:访问返回的数组时出现分段错误

启动线程导致指针初始化时出现分段错误

在指针迭代中使用 for 循环时出现分段错误

删除时出现分段错误