c - Dynamic Allocation of 2D Array -


i implementing graphs using adjacency matrix, unable solve segmentation fault. can me in guiding dynamic allocation of 2 dimensional matrix? want know how 2-d array stored in memory , how accessed.

#include<stdio.h> #include<stdlib.h>  struct graph{ int v; // represent number vertex... int e; //to represent number edge..... int **adj; // 2 dimensional matrix form adjacency matrix...  };   struct graph *adjmatrixofgraph(){          int i;    //for scanning edges between them ....          int u,v; // loop while initliasing  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 g->adj);         /*dynamic memory allocation 2 dimensional arrays */  /*      g->adj = malloc(g->v * sizeof(int ));              if(g->adj == null) {                           printf( "out of memory\n");                      }                for(i = 0; < 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 complete adjacency matrix zero.         }         }          //enter edges.. , vertices.         //we considering graph undirected 1 ...          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 graph directed should have considere 1 side...          //g->v[u][v]=1;          }   return g; }  main() { struct graph *g1=adjmatrixofgraph();  //struct graph *adjmatrixofgraph(){ printf("successful"); return 0; } 

allocating memory int **adj done in following way:

first allocate memory number of pointers integers have:

adj = malloc(sizeof(int*) * number_of_integers); /* notice pass sizeof */ 

next allocate memory each integer individually:

for (i = 0; < number_of_integers; i++)     adj[i] = malloc(sizeof(int) * g->e); 

and of course every malloc call needs followed free call, in similar fashion.

notice don't cast result of malloc.

i've made few other changes code:

update scanf ensure have no problems newlines remaining in buffer:

    printf("number of vertices: ");     scanf(" %d", &g->v);     printf("number of edges: ");     scanf(" %d", &g->e); 

initialise them (alternatively, lookup calloc, zero-initialisation you):

    for(u=0;  u < g->v; u++) // each vertice     {         for(v=0; v < g->e; v++) // each edge         {             g->adj[u][v] = 0;         }     } 

the part below i'm not sure about, manually set edges one, right? shouldn't use g->v , not g->e?

    for(i = 0; < 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 size of vertice/edges\n");             exit(1);         }          g->adj[u][v] = 1;          g->adj[u][v] = 1;     } 

i able print successful after this. if want make little easier, compile code -g flag , if you're on linux ulimit -c unlimited. create coredump file every time segfault.

then see problem is, run gdb your_app core , inside run backtrace. cannot stress how important use debugger in these cases.


Comments

Popular posts from this blog

javascript - Count length of each class -

What design pattern is this code in Javascript? -

hadoop - Restrict secondarynamenode to be installed and run on any other node in the cluster -