初始化其中包含数组元素的结构数组

Vid*_*dya 3 c arrays pointers multidimensional-array

#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;
}
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?

gcc -o main *.c 
Run Code Online (Sandbox Code Playgroud)

我收到这个错误

main.c:在函数'main'中:main.c:15:12:错误:'{'标记vs [0] = {1,{1,2,3,4,5}之前的预期表达式,{'c ", 'D'}};

但如果我有这个:

#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;
}
Run Code Online (Sandbox Code Playgroud)

有用.这是什么逻辑.

如何使用st vs [1]方法使其工作?

P.P*_*.P. 8

您只能在声明变量时进行支撑初始化.所以,

st vs[] = {
            {1,{1,2,3,4,5},{'c','d'}}
          };
Run Code Online (Sandbox Code Playgroud)

被允许.但

vs[0] = {1,{1,2,3,4,5},{'c','d'}};
Run Code Online (Sandbox Code Playgroud)

不是.因为这不是初始化而是分配.

但是,您可以使用C99复合文字,参见C11,6.5.2.5:

vs[0] = (struct s){1,{1,2,3,4,5},{'c','d'}};
Run Code Online (Sandbox Code Playgroud)