我正在尝试在结构中创建一个字符串数组,表示玩家的库存。
我为玩家创建了一个结构:
typedef struct Player {
char *inventory[];
} Player;
然后我使用一个分配堆内存的函数,并在玩家的“库存”中创建(不确定“create”是否为正确的单词)结构中包含一些“项目”。
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"};
有人能够指出正确的道路,为什么这不起作用?
答案 0 :(得分:2)
您对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;
}
答案 1 :(得分:1)
typedef struct Player {
char *inventory[10];
} Player;
static const char *arr[] = { "potion", "potion", "ether"};
memcpy(stats->inventory, arr, sizeof(arr));
或者
typedef struct Player {
char **inventory;
} Player;
Player *stats = malloc(sizeof(Player));
stats->inventory = (char**)malloc(sizeof(char*) * 10);
static const char *arr[] = { "potion", "potion", "ether"};
memcpy(stats->inventory, arr, sizeof(arr));
或者
stats->inventory[0] = "potion";
stats->inventory[1] = "potion";
stats->inventory[2] = "ether";
也许您应该在末尾添加一个NULL指针来指示长度。
stats->inventory[3] = NULL;
static const char *arr[] = { "potion", "potion", "ether", NULL };
memcpy(stats->inventory, arr, sizeof(arr));
或者只是在你的结构中有一个int inventory_size
。
答案 2 :(得分:0)
您需要明确声明一个名为 inventory 的数组,指定其大小。
然后初始化指针指向它。
这是我在两天内第三次看到这个错误。