Emalp
Emalp

Reputation: 123

First element in a double pointer to struct is jiberrish

I am creating a simple array of structures in C, but the first structure is always jibberish. How do i fix this?

I have tried to set the first element of the double pointer to struct in many ways but it always fails.

This is my graph.h file:


#ifndef GRAPH_H
#define GRAPH_H

#include "set.h"

typedef struct urlNode * URLList;
typedef struct GraphRep * Graph;

struct urlNode {
    int id;
    char* URL_NAME;
    URLList       next; // link to next node
};

struct GraphRep {
    int nV;
    URLList * collections;
};

Graph newGraph(Set s);
int nameToId(Graph g, char *name);
void showGraph(Graph g);

#endif


And my newGraph(Set s) function looks like this:

Graph newGraph(Set s){

    int size = nElems(s);
    Graph new_graph = malloc(sizeof(struct GraphRep));
    if (new_graph == NULL) {
        printf("ERROR: COULDNT ALLOCATE GRAPH\n");
    }

    new_graph->nV = size;
    char *name = getNextVal(s);


    // THIS IS THE NODE TO BE ADDED TO THE GRAPH
    URLList list_to_add = malloc(sizeof(struct urlNode));
    list_to_add->URL_NAME = strdup(name);
    list_to_add->id = 0;
    list_to_add->next = NULL;


    // HERE I ADD THE NODE TO THE GRAPH.
    new_graph->collections[0] = list_to_add;

    // PRINT OUT THE VALUES OF THE NEWLY ADDED NODE TO MAKE SURE IT WORKS
    // THE URL_NAME IS PRINTED OUT FINE 
    // BUT THE ID IS JIBBERISH.
    printf("%s\n", new_graph->collections[0]->URL_NAME);
    printf("%d\n", new_graph->collections[0]->id);
    if(new_graph->collections[0]->next != NULL) {
        printf("%s\n", new_graph->collections[0]->next->URL_NAME);
        printf("%d\n", new_graph->collections[0]->next->id);            
    }
    printf("\n");

    return new_graph;
}

I expect new_graph->collections[0]->id to be 0 but it keeps on giving me random ints. Also even if the next for the newly declared pointer to struct is NULL, it still gives me a jibberish next value too. Any help would be appreciated, thanks!

Upvotes: 0

Views: 180

Answers (1)

Vlad from Moscow
Vlad from Moscow

Reputation: 311058

The data member collections of the object *new_graph is not initialized.

There is initialized only this data member

new_graph->nV = size;

So this statement

new_graph->collections[0] = list_to_add;

results in undefined behavior.

If you need an array of pointers of the type URLList you have to allocate the memory and its address assign to the pointer collections.

For example

new_graph->collections = malloc( new_graph->nV * sizeof( URLList ) );

And after that this statement

new_graph->collections[0] = list_to_add;

could be valid.

(I suppose that the data member nV corresponds to the number of elements in the dynamically allocated array though it may not be truth)

Pay attention to that as the string pointed to by the pointer name is not changed in the function then it is better to declare it like

const char *name = getNextVal(s);

Upvotes: 3

Related Questions