我正在使用图形实现路径规划算法。在我的实现中,我具有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
};
答案 0 :(得分:3)
您的Node
包含一个list
。这是一个具有自己非平凡状态的C ++类。
Node node_array[5];
和calloc(5, sizeof(Node) )
之间的区别在于,第一个实际上将正确地调用构造函数。当试图将这个初始化不良的列表复制到其他地方时,代码炸弹爆炸。如果要动态分配,请改用new Node[5]
。