用数组元素初始化结构的数组

维迪亚
#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;
}

为什么这不起作用?

gcc -o main *.c 

我得到这个错误

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;
}

有用。这是什么逻辑。

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

MM

初始化是在声明变量并为声明提供变量的初始值时。例如,这是合法的:

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

您的代码实际上正在尝试分配赋值是指为现有变量分配值。您的代码不起作用的原因是那{1,{1,2,3,4,5},{'c','d'}}不是值。

在一个语句(不是声明)中,每个表达式必须由编译器根据自身的优点进行读取,而更复杂的语句由运算符连接的各种表达式组成。因此,编译器不知道如何处理{1,{1,2,3,4,5},{'c','d'}}-在此阶段,它尚不知道应该将其视为st

由于C99,您可以在此处使用一种称为复合文字的新语言构造

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

注意,这不是将强制转换运算符应用于某种形式的支撑表达式;它是一个语法结构(Typename){ initializers }

我使用的const是微优化,它可以帮助编译器将文字存储在可执行文件的只读块中并允许不断折叠。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章