分配给struct中结构的语法

时间:2015-01-16 08:31:14

标签: c struct

我有一个由肢体和枚举组成的结构实体,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
    };
}

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

4 个答案:

答案 0 :(得分:2)

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

应该是:

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

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

*entity = new;

答案 3 :(得分:0)

如果您已经在entity指向的地址分配了内存,并且您要做的就是“分配特定值”,那么您可以按以下方式执行:

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