当我在 C++ 中使用结构创建节点时出现分段错误
Posted
技术标签:
【中文标题】当我在 C++ 中使用结构创建节点时出现分段错误【英文标题】:I get a segmentation fault when I create a node with a struct in c++ 【发布时间】:2015-06-13 00:51:05 【问题描述】:我使用以下结构作为堆的节点
struct Node
int k;
*p,**array;
然后我创建了一个类,它是堆。在我的代码中,我必须在函数中初始化堆,然后执行以下操作
for (int i= 0; i < V;i++)
array[i] = newNode(0);
函数 newNode() 如下:
struct Node* newNode(int k)
struct Node* node;
node->k = k;
return node;
问题是,当我调试我的代码时,它会因函数 newNode() 中的分段错误而崩溃,该行是:
node->k = k;
我真的不知道该怎么办:(
【问题讨论】:
C++ 有用于在创建对象时初始化对象的构造函数。因此,毕竟你真的不需要newNode
。不过,在 newNode()
中,您不会分配 node
。
@101010 所以我应该删除函数 newNode 并像这样初始化:array[i]=0;
恕我直言,你应该这样做。
struct Node* node;
在这里你声明了一个指向节点的指针,但是你没有让它指向任何东西。 node->k = k;
在这里您取消引用该指针,导致 未定义的行为,因为它没有指向任何有效的 Node 对象。
在赋值之前不要使用变量的值!
【参考方案1】:
在newNode
函数中,您尚未初始化您声明的node
。因此,该指向节点的指针未正确分配。要解决此问题,您必须使用 new
运算符。
struct Node* newNode(int k)
struct Node* node = new Node();
node->k = k;
return node;
【讨论】:
【参考方案2】:您正在使用未初始化的node
。它没有指向任何地方,但您正在取消引用它 (node->
)。这会导致 C++ 中的未定义行为,其中段错误是有效形式。
如果如你所说,这是 C++,请停止将其编写为 C,并开始将其编写为 C++。
即
无需手动管理拥有的指针。 在这个简单的代码中根本不需要指针。而且,他们只是放慢速度。尽可能避免使用它们,即使在 C 语言中也是如此。 使用 C++ 标准库容器代替手动分配的数组。 编写构造函数,而不是编写像newSomething
这样的函数。
对对象使用构造函数,而不是手动分配它们的字段。
这样,您的代码变得更易读、更易于管理并且更不容易出错。
通过这些更改,您的代码可能如下所示:
#include <iostream>
#include <vector> // To be able to use std::vector
struct Node
Node(int param = 0) : k(param) // Constructor that takes an int and uses it to initialize k. If you don't provide the parameter, it defaults to 0 automatically ("= 0").
int k;
;
int main()
std::vector<Node> nodeArray(4); // Initialize the vector to hold 4 default constructed Nodes.
Node anotherNode(42); // Instantiate a new Node object with k set to 42.
nodeArray.push_back(anotherNode); // Copy it to the back of the vector.
for (auto& node : nodeArray) // Loops through all elements in nodeArray.
std::cout << node.k << ','; // Print the value of k of the current element.
上面打印0,0,0,0,42,
。
有关如何使用std::vector
的更多信息,请参阅here。
【讨论】:
以上是关于当我在 C++ 中使用结构创建节点时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章