c++ - 声明变量的分段错误 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);
解决方案
主要问题是您使用setNext
from 的返回值进行调用,您将AssignArray
其返回为&new_node
,它是指向Node
您在堆栈上分配的本地的指针。一旦函数返回,堆栈就会展开并且该Node
实例不再存在,从而使指针悬空。
至少你应该这样做:
Node* new_node = new Node(list[i]);
...
return new_node;
但我也觉得我们在这里遗漏了一些东西。很高兴看到 的定义Node
。这个构造函数如何不产生堆栈溢出?
Node::Node() {
next = new Node;
}
在构造函数中,您new Node
将再次调用相同的构造函数......这将再次调用构造函数......
唔。
推荐阅读
- c# - 对象是变量类型还是类中变量的名称?
- sql - 在一组组中查找第一次出现
- java - 使用 Java/SpringBoot 为令牌绑定协议协商启用 TLS 扩展
- python - 抓取特定文本表单网页
- omnet++ - check_and_cast():无法将“inet::physicallayer::INoise*”转换为“const inet::physicallayer::NarrowbandNoiseBase *”
- php - 从表单请求中获取数据并将其作为发布请求发送似乎不起作用
- django - Django 不同的方法()
- pyspark - pyspark udf AttributeError:“NoneType”对象没有属性“rfind”
- react-table - 如何为父元素和嵌套子行应用不同的渲染方式
- java - 提供多个数据值后,可以编写什么代码来比较数据并确定最高/最低值?爪哇