在Struct

时间:2016-03-06 19:51:26

标签: c arrays struct

我正在尝试在结构中创建一个字符串数组,表示玩家的库存。

我为玩家创建了一个结构:

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

有人能够指出正确的道路,为什么这不起作用?

3 个答案:

答案 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 的数组,指定其大小。

然后初始化指针指向它。

这是我在两天内第三次看到这个错误。