分配给结构中的结构的语法

Syntax for assigning to a struct in a struct

我有一个由 Limbs 和一个枚举组成的结构实体,Limbs 也是一个包含两个项目的结构,例如

typedef enum{ALIVE, DEAD} state;

typedef struct Limb{
    int is_connected;
    int is_wounded;
} Limb;

typedef struct Entity{
    Limb limb_1;
    Limb limb_2;
    state is_alive;
} Entity;

现在假设我有一个旨在为实体分配特定值的函数,此处使用的正确语法是什么?我目前的猜测是:

void assign_entity(Entity *entity){
    *entity = {
        .limb_1 = { 1, 0 },
        .limb_2 = { 1, 0 },
        .is_alive = ALIVE
    };
}

但是当我使用这种语法时出现错误(预期表达式),我在这里做错了什么?分配给结构内部结构的正确语法是什么。

指定的初始化语法只能在初始化中使用。

做你想做的事情的一种方法是:

Entity const new = {
    .limb_1 = { 1, 0 },
    .limb_2 = { 1, 0 },
    .is_alive = ALIVE
};

*entity = new;

您正在尝试使用 compound literal 但省略了正确的语法。

应该是:

void assign_entity(Entity *entity){
    *entity = ((Entity) { 
        .limb_1 = { 1, 0 },
        .limb_2 = { 1, 0 },
        .is_alive = ALIVE
    });
}

请注意,这需要 C99(当然,或适当扩展的编译器)。

如果您已经在 entity 指向的地址分配了内存,而您要做的只是 "assign particular values",那么您可以按如下方式进行:

void assign_entity(Entity *entity)
{
    entity->limb_1 = ( 1, 0 );
    entity->limb_2 = ( 1, 0 );
    entity->is_alive = ALIVE;
}

或者,如果您想将所有内容汇总成一行:

void assign_entity(Entity *entity)
{
    *entity = ((1, 0), (1, 0), ALIVE);
}

对于以下代码的人来说可能过于冗长:

void assign_entity(Entity *entity)
{
    entity->limp_1.is_connected = 1;
    entity->limp_1.is_wounded= 0;
    entity->limp_2.is_connected = 1;
    entity->limp_2.is_wounded= 0;
    entity->is_alive = ALIVE;
}