I am implementing a path planning algorithm using graphs. In my implementation I have structures Node and Edge. One of the members of Node is a list of edges. I have a weird problem that came up in my code when I used a pointer to a node in an array, I've managed to isolate it below:
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.
}
The program crashes (exists without printing "Yes it worked!") when I try to dereference pointer_to_node. There are three things I've noticed.
-If I define a Node, form a pointer and then dereference it, there is no problem.
-If I create an array of nodes using Node node_array[5];, the program works fine.
-If I remove the list of edges member from Node, everything works fine.
I know there are probably many easier ways to implement something like this, but I'm curious to know what exactly am I breaking here to make the program crash. I'm new to c++ and Stack Overflow, so any feedback is appreciated.
Here is the rest of the code above 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
};