user1163278
user1163278

Reputation: 421

Passing struct to function and adding elements

I'm new to C. I'm trying to pass a struct list to a function and within that function fill the list. Code is as follows:

#include <stdio.h>
#include <stdlib.h>

struct Abc {
    int test;
    struct Abc *next;
};

void demo_fill(struct Abc *data);

int main(int argc, char **argv) {
    struct Abc *db = NULL;
    demo_fill(db);
    printf("%d\n",db->test);
    return 0;
}

void demo_fill(struct Abc *data) {
    int i;
    for( i = 0; i < 5; i++ ) {
       struct Abc *new;
       new = malloc(sizeof(struct Abc));
       new->test = i;
       new->next = data;
       data = new;
   }  
}

When running this a 'Segmentation fault (core dumped)' error occurs because the struct is still NULL when I try to print the first element. What am I doing wrong?

Upvotes: 1

Views: 1875

Answers (3)

Bernd Elkemann
Bernd Elkemann

Reputation: 23550

You can pass a pointer to the pointer as the other two answers say, so i just point out an alternative you might also consider: Instead of using a single struct you could use one struct for the list and another for entry-links:

struct link {
    int test;
    struct link* next;
};
struct list {
    struct link* first;
};

void demo_fill(struct list* data);

You can then modify the first entry of the list without thinking about ** syntax.

Upvotes: 1

Ivaylo Strandjev
Ivaylo Strandjev

Reputation: 70989

Assigning data to new will have no effect. data is a local copy of the pointer. Pass a double pointer to fix that. Something like this:

void demo_fill(struct Abc** data) {
    int i;
    for( i = 0; i < 5; i++ ) {
       struct Abc *new;
       new = malloc(sizeof(struct Abc));
       new->test = i;
       new->next = *data;
       *data = new;
   }  
}

And of course you will have to pas the pointer to db in main:

demo_fill(&db)

Upvotes: 2

simonc
simonc

Reputation: 42185

You're passing the pointer by value. You need to pass a pointer to a pointer if you want the change the value of the caller's pointer:

int main(int argc, char **argv) {
    struct Abc *db = NULL;
    demo_fill(&db);
    printf("%d\n",db->test);
    return 0;
}

void demo_fill(struct Abc **data) {
    int i;
    for( i = 0; i < 5; i++ ) {
       struct Abc *new;
       new = malloc(sizeof(struct Abc));
       new->test = i;
       new->next = *data;
       *data = new;
   }  
}

Upvotes: 5

Related Questions