列表结构和数组的怪异问题

时间:2019-04-09 13:05:29

标签: c++

我正在使用图形实现路径规划算法。在我的实现中,我具有Node和Edge的结构。 Node的成员之一是边的列表。当我使用指向数组中节点的指针时,我的代码中出现了一个奇怪的问题,我设法在下面隔离了它:

int main()
{
  // Node node_array[5];                            // If I use this array, the program works fine.
  Node* node_array=(Node*)calloc(5, sizeof(Node) ); // This causes a problem

  Node* pointer_to_node=&(node_array[0]); 
  pointer_to_node->id=0;

  cout << "Did it work?" << "\n";//.
  cout << pointer_to_node->id << "\n";     // This works fine
  cout << (*pointer_to_node).id << "\n";   // This works fine
  Node bla=*pointer_to_node;               //This crashes the program. But if I remove the list of edges from Node, then it works fine.
  cout << "Yes it worked!" << "\n";        // Something is breaking if I don't reach this.
}

当我尝试取消对pointer_to_node的引用时,程序崩溃(不打印“是的,就存在!”存在)。我注意到了三件事。

-如果我定义一个Node,形成一个指针然后取消引用它,就没有问题。

-如果我使用Node node_array [5];创建节点数组,则程序运行正常。

-如果我从Node中删除edges成员列表,一切正常。

我知道可能有很多更简单的方法来实现类似这样的功能,但是我很好奇我到底在破坏什么使程序崩溃。我是c ++和Stack Overflow的新手,所以感谢您的反馈。

这是main()上方的其余代码

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <sys/types.h>
#include <time.h>
#include <sys/time.h>
#include <math.h>
#include <iostream>
#include <list>
using namespace std;

struct Node;        // NOTE: we'll define this in detail later, but we need it now
struct Edge;

// this is a basic graph node
struct Node
{
  int id;
  list<Edge> edges; // these are edges from {nodes which this node can be accessed}
};

//basic edge data stucture
struct Edge
{
  Node* startNode;     // the edge starts at this node
  Node* endNode;       // the edge goes to this node
  double edgeCost;     // going along the edge cost this much
};

1 个答案:

答案 0 :(得分:3)

您的Node包含一个list。这是一个具有自己非平凡状态的C ++类。 Node node_array[5];calloc(5, sizeof(Node) )之间的区别在于,第一个实际上将正确地调用构造函数。当试图将这个初始化不良的列表复制到其他地方时,代码炸弹爆炸。如果要动态分配,请改用new Node[5]