在C中初始化结构

时间:2017-08-25 21:17:11

标签: c struct

我在初始化结构时遇到了麻烦(实际上做得很好,但结构先做)。结构首先在标题中生成,如下所示

typedef enum cell
{
    BLANK, RED, CYAN
} Cell;    
#define NAMELEN 20

typedef struct player
{
    char name[NAMELEN + NULL_SPACE];
    Cell token;
    unsigned score;
} Player;

void initFirstPlayer(Player * player);
void initSecondPlayer(Player * player, Cell token);

#endif

=============================================== ========================

我尝试在这里初始化

void initFirstPlayer(Player * player)
{
    int randNo = rand() % 2;
    if (randNo == 0) {
        token = RED;
    }
    else() {
        token = CYAN;
    }


    player ; p1 = {
    "placeholder",
    token,
    0,

    }
}

void initSecondPlayer(Player * player, Cell token)
{ }

初始化此播放器结构的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

我怀疑这对你有用。使用通用initPlayer函数。用它来为播放器分配内存并设置初始值。确保在完成后freePlayer功能还包括free()播放器。

#include <stdlib.h>
#include <string.h>

Player* initPlayer()
{
    Player* player = malloc(sizeof(Player));
    int randNo = rand() % 2;
    if (randNo == 0) {
        player->token = RED;
    }
    else {
        player->token = CYAN;
    }

    const char* initName = "placeholder";
    strcpy(player->name, initName);
    player->score = 0;

    return player;
}
void freePlayer(Player* p)
{
    free(p);
}

你使用它的方式是这样的:

int main()
{
    Player* p1 = initPlayer();
    Player* p2 = initPlayer();

    play(p1, p2);

    freePlayer(p1);
    freePlayer(p2);
}

答案 1 :(得分:0)

假设您至少拥有C99支持,以便可以使用复合文字和指定的初始值设定项,那么您可以使用:

void initFirstPlayer(Player *player)
{
    *player = (Player){ .token = rand() % 2 ? CYAN : RED,
                        .score = 0,
                        .name  = "placeholder"
                      };
}

这是对其地址传递给函数的变量的结构赋值。它把它压缩成一个声明;如果你愿意,你可以把它分成几个。这是三元? :运算符有用的场合。你可能更喜欢(rand() % 2)加括号;我可能会经常添加它们,因为我省略了它们。

复合文字来自(typename){ ...initializer for typename... }

指定的初始值设定项为.member = value符号。

如果你不熟悉C90支持,你必须更加努力,也许用正确的信息创建一个局部变量,然后进行结构分配。

void initFirstPlayer(Player *player)
{
    Player p1 = { "placeholder", rand() % 2 ? CYAN : RED, 0 };
    *player = p1;
}

现在您有责任以正确的顺序列出初始化程序。

答案 2 :(得分:0)

另一种方法是接收你想要参与的玩家作为参数:

void initPlayer(Player* player)
{
    int randNo = rand() % 2;
    if (randNo == 0) {
        player->token = RED;
    }
    else {
        player->token = CYAN;
    }
    const char* initName = "placeholder";
    strcpy(player->name, initName);
    player->score = 0;
}

int main() {
        Player p1;

        initPlayer(&p1);  
}

您可以拥有一系列玩家或使用malloc进行动态分配。