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

C 在结构内部创建字符串数组,c,arrays,struct,C,Arrays,Struct,我试图在一个结构中创建一个字符串数组,它表示一个玩家的库存 Player *spawnPlayer(void) { Player *stats = malloc(sizeof(Player)); stats->inventory[] = {"potion", "potion", "ether"}; return stats; } 我为玩家创建了一个结构: typedef struct Player { char *inventory[]; } Play

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

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

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

    return stats;
}
我为玩家创建了一个结构:

typedef struct Player {
    char *inventory[];
} Player;
然后我使用一个函数分配堆内存并创建(不确定这里的“create”是否正确)在播放器的“inventory”中包含一些“items”的结构

现在,我可以在结构外部创建这样的普通数组,但如果我尝试使用上述方法,则在尝试编译时会出现以下错误:

arrays.c: In function 'spawnPlayer':
arrays.c:13:19: error: expected expression before ']' token
  stats->inventory[] = {"potion", "potion", "ether"};
有人能给我指出一条正确的道路,解释为什么这不起作用吗

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

static const char *arr[] = { "potion", "potion", "ether"};
memcpy(stats->inventory, arr, sizeof(arr));

也许您应该在末尾添加一个空指针来指示长度

stats->inventory[3] = NULL;

static const char *arr[] = { "potion", "potion", "ether", NULL };
memcpy(stats->inventory, arr, sizeof(arr));

或者在你的结构中有一个
int inventory\u size

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

可以通过以下方式定义固定大小的数组:

typedef struct Player {
    char *inventory[3];
} Player;
Player *spawnPlayer(void) {
    Player *stats = malloc(sizeof(*stats));

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

    return stats;
}
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;
}
您可以通过以下方式初始化已分配的
Player
实例:

typedef struct Player {
    char *inventory[3];
} Player;
Player *spawnPlayer(void) {
    Player *stats = malloc(sizeof(*stats));

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

    return stats;
}
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;
}
如果希望阵列在运行时具有已知的大小并使用灵活的阵列,则可能需要为实际分配的大小添加成员:

typedef struct Player {
    int size;
    char *inventory[];
} Player;
您将通过以下方式分配并初始化它:

typedef struct Player {
    char *inventory[3];
} Player;
Player *spawnPlayer(void) {
    Player *stats = malloc(sizeof(*stats));

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

    return stats;
}
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的扩展,您可以通过定义
inventory
(大小为
0
)来模拟C90中的灵活数组。编译器是否支持灵活数组,大小为
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;
}

您需要显式声明一个名为inventory的数组,指定其大小

然后初始化一个指向它的指针


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

该错误消息与您显示的代码不一致。请修复一个或另一个。对此我深表歉意!我修正了错误。我的测试代码中的名称不同,我尝试在括号内指定一个数字。。我修改了它,以反映我在帖子中粘贴的内容,并试图编译。在一个大小未知的结构中使用数组是否合法,除了可变大小的数组技巧之外?在这两种情况下,您还需要包括一些方法,让
播放器的用户知道您已经将整整三项复制到了10项列表中。谢谢您的精彩解释。我将使用它并将其应用到我的游戏中。