75061

Dynamic Allocation of 2D Array

Question:

I am implementing graphs using adjacency matrix, but I am unable to solve the segmentation fault. Can anyone help me in guiding dynamic allocation of two dimensional matrix? I also want to know how is 2-D array stored in memory and how it is accessed.

#include<stdio.h> #include<stdlib.h> struct Graph{ int V; // To represent number the vertex... int E; //To represent number the Edge..... int **Adj; // Two dimensional matrix to form the adjacency matrix... }; struct Graph *adjMatrixOfGraph(){ int i; //for scanning the edges between them .... int u,v; // for loop while initliasing the adjacency matrix... struct Graph *G=(struct Graph*) malloc(sizeof(struct Graph)); // if(!G){ printf("Memory Error"); return; } printf("Number of Vertices"); scanf("%d",&G->V); printf("%d",G->V); printf("Number of Edges"); scanf("%d",&G->E); G->Adj=(int **)malloc(sizeof(G->V * G->V)); //allocating memory for G->Adj); /*Dynamic memory allocation for Two Dimensional Arrays */ /* G->Adj = malloc(G->V * sizeof(int )); if(G->Adj == NULL) { printf( "out of memory\n"); } for(i = 0; i < G->V; i++) { G->Adj[i] = malloc(G->V * sizeof(int )); if(G->Adj[i] == NULL) { printf( "out of memory\n"); } } */ if(!G->Adj) { printf("Memory Error"); return; } for(u=0; u < G->V; u++){ for(v=0; v < G->V; v++){ //printf("%d %d",u,v); G->Adj[u][v]=0; //initalising the complete adjacency matrix to zero. } } //Enter the edges.. and the vertices. //We are considering this graph as undirected one ... for(i=0;i< G->E;i++) { scanf("Reading Edges %d %d ",&u,&v); G->Adj[u][v]=1; G->Adj[u][v]=1; //if this graph was directed then we should have considere only one side... //G->V[u][v]=1; } return G; } main() { struct Graph *G1=adjMatrixOfGraph(); //struct Graph *adjMatrixOfGraph(){ printf("Successful"); return 0; }

Answer1:

Allocating memory for int **Adj is done in the following way:

First you allocate memory for the number of pointers to integers you will have:

Adj = malloc(sizeof(int*) * number_of_integers); /* notice what I pass to sizeof */

Next you allocate memory for each integer individually:

for (i = 0; i < number_of_integers; i++) Adj[i] = malloc(sizeof(int) * G->E);

And of course every malloc call needs to be followed by a free call, in a similar fashion.

Notice I don't <a href="https://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc" rel="nofollow">cast the result of malloc</a>.

I've made a few other changes to your code:

Update your scanf to ensure you have no problems with newlines remaining in the buffer:

printf("Number of Vertices: "); scanf(" %d", &G->V); printf("Number of Edges: "); scanf(" %d", &G->E);

Initialise them (alternatively, lookup <a href="http://www.cplusplus.com/reference/cstdlib/calloc/" rel="nofollow">calloc</a>, as it does zero-initialisation for you):

for(u=0; u < G->V; u++) // for each vertice { for(v=0; v < G->E; v++) // for each edge { G->Adj[u][v] = 0; } }

The part below I'm not sure about, you manually set the edges to one, right? Shouldn't you use G->V and not G->E?

for(i = 0; i < G->V; i++) { printf("Reading vertice u: "); scanf(" %d",&u); printf("Reading edge v: "); scanf(" %d",&v); if (u > G->V || v > G->E) // simple error handling { printf("Input bigger than size of vertice/edges\n"); exit(1); } G->Adj[u][v] = 1; G->Adj[u][v] = 1; }

I was able to print Successful after this. If you want to make this a little easier, compile your code with the -g flag and if you're on Linux do ulimit -c unlimited. This will create a coredump file every time you get a segfault.

Then to see where the problem is, run gdb your_app core and inside run backtrace. I cannot stress how important it is to use a debugger in these cases.

Answer2:

int **allocate_2D_array(int rows, int columns) { int k = 0; int **array = malloc(rows * sizeof (int *) ); array[0] = malloc(columns * rows * sizeof (int) ); for (k=1; k < rows; k++) { array[k] = array[0] + columns*k; bzero(array[k], columns * sizeof (int) ); } bzero(array[0], columns * sizeof (int) ); return array; }

Recommend

  • Using numpy.unique on multiple columns of a pandas.DataFrame
  • Know of any tools to monitor the REAL performance of an amazon ec2 instance? [closed]
  • Convert LPWSTR * array of string pointers to C#
  • How to read csv file into an Array of arrays in scala
  • Doctrine DQL returning flat array from join
  • Use WPF object to 'punch' hole in another?
  • Fold function in Octave
  • Shortest path in a grid
  • Colour specific node in igraph
  • Can we reuse allocated memory
  • Calculating Digital Root, is there a better way?
  • iOS 8.3 - Metal, found nil while unwrapping an Optional Value
  • How to store a void* reference to a struct in Rust?
  • Salted sha512 in C, cannot synchronise with Symfony2's FOSUserBundle
  • Getting segmentation fault while using malloc
  • Making a switch statement in C with an array?
  • OSStatus error -50 (invalid parameters) AudioQueueNewInput recording audio on iOS
  • Thrust filter by key value
  • How to delete a newline using \\b
  • How to work with AMMediaType for video filters
  • OpenGL - Object Transformations and VBOs
  • How to unpack 32bit integer packed in a QByteArray?
  • allocating memory to an array of string
  • Calculating ratio of reciprocated ties for each node in igraph
  • why overloaded new operator is calling constructor even I am using malloc inside overloading functio
  • Get data from AJAX - How to
  • Initializer list vs. initialization method
  • Is there a javascript serializer for JSON.Net?
  • Adding a button at the bottom of a table view
  • Why is the size of this struct 32?
  • Where to put my custom functions in Wordpress?
  • Rearranging Cells in UITableView Bug & Saving Changes
  • Circular dependency while pushing http interceptor
  • retrieve vertices with no linked edge in arangodb
  • Linker errors when using intrinsic function via function pointer
  • Buffer size for converting unsigned long to string
  • FormattedException instead of throw new Exception(string.Format(…)) in .NET
  • Binding checkboxes to object values in AngularJs
  • Android Heatmap on canvas or ImageView
  • Conditional In-Line CSS for IE and Others?