youngwarlock
youngwarlock

Reputation: 7

How do I print elements of structures contained in an array

I have created an array of structure as a global variable. I initialised the array in a function and I could print out the elements of the structure from there. My problem is that I can't print out values of the array in another function( main() in my case) other than the one I used to initialise the array. Please how can I print those values? Thank you.

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

/*
 * 
 */
typedef struct s{
    char *value;
} S;

S list[2];

void function( ){
    char val1[] = "val1";
    char val2[] = "val2";
    S v1 = {val1};
    S v2 = {val2};
    list[0] = v1;
    list[1] = v2;
    printf("%s\n", list[1].value); //prints val2
}
int main(int argc, char** argv) {
    function();
    printf("%s", list[1].value); //prints nonsense 
    return 0;
}

What I have tried :

  1. I modified function() to take list as an argument( function (list)) and declared list in main() instead. It didn't work.

  2. I modified function to return list (S* function()), it didn't work.

  3. I used an array of integers ( instead of structure i.e. int list[2], declared it as a global variable and initialised it in function()) and everything worked fine, suggesting that the problem is from how I am accessing structure, but I just can't figure it out.

  4. I searched the internet, but couldn't get a similar problem.

Upvotes: 0

Views: 1130

Answers (1)

Osiris
Osiris

Reputation: 2813

In your function function you assign an address of a local variable to your structure. After returning from function this address is no longer valid. You could either make it static or allocated it dynamically.

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

typedef struct s
{
    char *value;
} S;

S list[2];

void function( )
{
    char val1[] = "val1";
    char val2[] = "val2";
    //Note that you are creating a copy of "val1" here which can be avoided by changing it to char *val1 = "val1";

    list[0].value = malloc(strlen(val1)+1); //allocate space for val1 + NUL-terminator
    strcpy(list[0].value, val1); //copy string
    list[1].value = malloc(strlen(val2)+1);
    strcpy(list[1].value, val2);

    //You could also use the function strdup which allocates memory and duplicates the string
    //list[0].value = strdup(val1);

    printf("%s\n", list[1].value); //prints val2
}

int main(int argc, char** argv)
{
    function();
    printf("%s", list[1].value);

    free(list[0].value); //Don't forget to free.
    free(list[1].value);
    return 0;
}

Upvotes: 2

Related Questions