首页 > 解决方案 > 声明变量的分段错误 C++

问题描述

我正在尝试创建一个节点类。节点类有两个变量:一个 int 和一个指向另一个节点的指针。这是我的节点构造函数。我在另一个堆栈溢出中发现,为了为值分配内存,您需要包含一个“new ...”短语。

Node::Node() {
    next = new Node;
}

Node::Node(int new_num) {
    num = new_num;
    next = new Node;
}

我正在使用一个名为 AssignArray 的方法,它接受一个整数数组并将其转换为节点的链接列表。它的一部分工作,除非我尝试在我的节点上使用 setNext 方法。setNext 方法只是一个常规的设置器。

void Node::setNext(Node* new_next) {
    next = new_next;
}

Node* Node::AssignArray(int list[], int i, int size) {
    if (i == size) {
        return NULL;
    }
    else {
        Node new_node(list[i]);
        i++;
        new_node.setNext(new_node.AssignArray(list, i , size));
        return &new_node;
    }

}

到目前为止,这是我的主要功能:

int main() {

    int nums1[] = {1,2,3,4,5};
    int nums2[] = {1,3,5,7,9};
    
    Node node1 = Node();
    int nums1_size = sizeof(nums1)/sizeof(nums1[0]);
    node1.AssignArray(nums1, 0, nums1_size);
    

标签: c++pointerssegmentation-fault

解决方案


主要问题是您使用setNextfrom 的返回值进行调用,您将AssignArray其返回为&new_node,它是指向Node您在堆栈上分配的本地的指针。一旦函数返回,堆栈就会展开并且该Node实例不再存在,从而使指针悬空。

至少你应该这样做:

Node* new_node = new Node(list[i]);
...
return new_node;

但我也觉得我们在这里遗漏了一些东西。很高兴看到 的定义Node。这个构造函数如何不产生堆栈溢出?

Node::Node() {
    next = new Node;
}

在构造函数中,您new Node将再次调用相同的构造函数......这将再次调用构造函数......

唔。


推荐阅读