LittleDev
LittleDev

Reputation: 113

How to initialize a Linked List with a struct with many variables

I still have troubles with the relations between the linked lists and the structures.

See, my objectif is to create a list where each node contains 2 characters strings. So, I tried something like this : first, I create a structure that represent an element with my 2 char ; second, a control structure for my list, thath will point at the beginning of my list. Which, in my .h, gives something like this :

typedef struct s_def { char *first_word; char *second_word; struct s-def *next; }  t_def

typedef struct s_type { t_def *first; } t_list;

Next, I try to initialize my list. I make a function that work like this :

t_list *list;
t_def *words;

list = malloc(sizeof(*list));
words = malloc(sizeof(*words));
if (list == 0 || words == 0)
   return (NULL);
words = NULL;
words->next = NULL;
list->first = words;

return (list);

Precision : I try to make an empty list for now, so that the user can add some elements later.

And that's where it block : when I run the program, it gives the typical Segmentation Fault. But it don't see what's wrong with what I made ! I put some write in my function to retrace the process : the malloc are working ok, as well as the words = NULL, but then the segment fault seems to run at the line

words->next = NULL;

What do I make wrong ? Why can't I give a NULL value at the next of my words ?

Upvotes: 4

Views: 2526

Answers (3)

PeteB
PeteB

Reputation: 372

When you set words to NULL, you have made a null pointer. Trying to access it immediately afterwards by words->next is effectively doing NULL->next which will cause an error. Your code looks a little more complex than it needs to be for a simple linked list implementation, you might try something like:

typedef struct s_element
{
    char* firstWord;
    char* secondWord;
    s_element* next;
} t_element;


t_element* list = NULL;

t_element* addFront(t_element* list, char* word1, char* word2)
{
    t_element* next = list;
    list = malloc(sizeof(t_element));
    if (!list) return NULL;
    list->firstWord = word1;
    list->secondWord = word2;
    list->next = next;
    return list;
}

Assuming I haven't made any bone-headed syntax mistakes, this should be about as clear as a linked list can get. Notice that it doesn't need to check if the list is empty, the only conditional is in case malloc has failed.

Upvotes: 1

Some programmer dude
Some programmer dude

Reputation: 409482

The problem is most likely this part:

words = NULL;
words->next = NULL;

Here you reassign the pointer words to be a null pointer, and directly afterwards you dereference this null pointer, leading to undefined behavior.

Upvotes: 5

nos
nos

Reputation: 229342

You first initialize the word pointer with allocated memory

words = malloc(sizeof(*words));

Then 3 lines down you set that pointer to NULL again, creating a memory leak

words = NULL;

And then you try to dereference the pointer that you just set to NULL:

words->next = NULL;

So, just remove the words = NULL;

Upvotes: 5

Related Questions