gpt4 book ai didi

在结构内部创建字符串数组

转载 作者:太空宇宙 更新时间:2023-11-04 01:54:55 25 4
gpt4 key购买 nike

我正在尝试在代表玩家元素栏的结构中创建一个字符串数组。

我为播放器创建了一个结构体:

typedef struct Player {
char *inventory[];
} Player;

然后我使用一个函数来分配堆内存并创建(不确定“创建”是否是正确的词)在玩家的“库存”中包含一些“项目”的结构。

Player *spawnPlayer(void)
{
Player *stats = malloc(sizeof(Player));

stats->inventory[] = {"potion", "potion", "ether"};

return stats;
}

现在我可以在结构之外创建一个像这样的普通数组,但是如果我尝试使用上面的数组,我在尝试编译时会遇到以下错误:

arrays.c: In function 'spawnPlayer':
arrays.c:13:19: error: expected expression before ']' token
stats->inventory[] = {"potion", "potion", "ether"};

有人能为我指明正确的道路,说明为什么这行不通吗?

最佳答案

您对 Player 的定义是 C99 扩展调用灵活数组的示例:一个大小未知的数组,它是结构的最后一个成员,只能访问实际分配给的大小每个实例。您可能不想使用它。并且您不能使用 spawnPlayer 函数中使用的语法来初始化这些值。

你可以这样定义一个固定大小的数组:

typedef struct Player {
char *inventory[3];
} Player;

并且您可以这样初始化分配的 Player 实例:

Player *spawnPlayer(void) {
Player *stats = malloc(sizeof(*stats));

stats->inventory[0] = "potion";
stats->inventory[1] = "potion";
stats->inventory[2] = "ether";

return stats;
}

如果您想让数组的大小在运行时已知并使用灵活的数组,您可能需要为分配的实际大小添加一个成员:

typedef struct Player {
int size;
char *inventory[];
} Player;

您将以这种方式分配和初始化它:

Player *spawnPlayer(void) {
Player *stats = malloc(sizeof(*stats) + 3 * sizeof(*stats->inventory));

stats->size = 3;
stats->inventory[0] = "potion";
stats->inventory[1] = "potion";
stats->inventory[2] = "ether";

return stats;
}

灵活数组是 C99 扩展,你可以在 C90 中通过定义 inventory 来模拟它们,大小为 0 如果编译器支持它,或者大小为 1,但它不是严格可移植的。

还有第三种可能性,使用指向 char* 数组的指针:

typedef struct Player {
int size;
char **inventory;
} Player;

Player *spawnPlayer(void) {
Player *stats = malloc(sizeof(*stats));

stats->size = 3;
stats->inventory = malloc(sizeof(*stats->inventory) * 3);
stats->inventory[0] = "potion";
stats->inventory[1] = "potion";
stats->inventory[2] = "ether";

return stats;
}

关于在结构内部创建字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35831715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com