当我在 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-&gt;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-&gt;)。这会导致 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++ 中使用结构创建节点时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章

删除时出现分段错误

分段错误:在 C++ 中弹出向量时出现 11

创建邻接列表时出现分段错误

在 C++ 中使用向量时出现分段错误

从二进制文件加载图像像素时出现 C++ 分段错误

运行 C++ 代码时出现分段错误