Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

initializing array of structure with array elements in it

#include <stdio.h>

int main()
{
    typedef struct s
    {
        int a;
        int b[5];
        char c[2];
    }st;

    st vs[1];

    vs[0] = {1,{1,2,3,4,5},{'c','d'}};

    printf("%d:a\n",vs[1].a);
    printf("%d:b[0]\t %d:b[4]\n",vs[0].b[0],vs[0].b[4]);
    printf("%c:c[0]\t %c:c[1]\n",vs[0].c[0],vs[0].c[1]);

    return 0;
}

why does this doesn't work?

on

gcc -o main *.c 

I get this error

main.c: In function 'main': main.c:15:12: error: expected expression before '{' token vs[0] ={1,{1,2,3,4,5},{'c','d'}};

But if I have this:

#include <stdio.h>

int main()
{
    typedef struct s
    {
        int a;
        int b[5];
        char c[2];
    }st;

    st vs[] = {
                {1,{1,2,3,4,5},{'c','d'}}
              };

    printf("%d:a\n",vs[0].a);
    printf("%d:b[0]\t %d:b[4]\n",vs[0].b[0],vs[0].b[4]);
    printf("%c:c[0]\t %c:c[1]\n",vs[0].c[0],vs[0].c[1]);

    return 0;
}

it works. What is the logic in this.

How can I make it work using st vs[1] method?

like image 771
Vidya Avatar asked Feb 10 '26 17:02

Vidya


1 Answers

You can only do braced initialization when you declare a variable. So,

st vs[] = {
            {1,{1,2,3,4,5},{'c','d'}}
          };

is allowed. But

vs[0] = {1,{1,2,3,4,5},{'c','d'}};

is not. Because this is not a initialization but assignment.

However, you can use C99's compound literal, see C11, 6.5.2.5:

vs[0] = (struct s){1,{1,2,3,4,5},{'c','d'}};
like image 153
P.P Avatar answered Feb 12 '26 14:02

P.P