使用malloc初始化结构中的结构?

时间:2015-02-22 22:56:52

标签: c pointers struct malloc

这是NPC的数据结构。

typedef struct npc {
   npc_characteristics_t characteristics;
   position pc_last_known_position;
   position npc_position;
   int speed;
   int turn;
} npc_t;

我用它初始化它:

void gen_monsters(dungeon *d, int nummon) {
  int i;
  for (i = 0; i < nummon; i++) {
    npc_t *monster;
    if (!(monster = malloc(sizeof (*monster)))) {
      perror("malloc");
      exit(1);
    } else {
      init_monster(monster);
    }
  }
}

static void init_monster(npc_t *m) {
  int charact = rand()%3;

  if (charact == 0) 
    m->characteristics = 0x00000000;
  else if (charact == 1)
    m->characteristics = NPC_SMART;
  else if (charact == 2)
    m->characteristics = NPC_TELEPATH;

  m->pc_last_known_position = {0, 0};
  m->npc_position = {0, 0};
  m->speed = rand() % 15 + 6;
  m->turn = 0;
}

这是我的position结构:

typedef struct position_t {
  int x, y;
} position;

为什么这不起作用?我得到了这个:

npc.c:22:1: error: expected identifier or ‘(’ before ‘}’ token
 }
 ^
npc.c: In function ‘init_monster’:
npc.c:35:30: error: expected expression before ‘{’ token
  m->pc_last_known_position = {0,0};
                          ^
npc.c:37:20: error: expected expression before ‘{’ token
  m->npc_position = {0,0};
                    ^
make: *** [npc.o] Error 1

这样做的正确方法是什么?我应该使用malloc为结构留出一些内存空间吗?但是,我也不需要为position执行此操作,并给NPC指向position结构的指针吗?

1 个答案:

答案 0 :(得分:2)

虽然您不能以这种方式使用初始化列表,但您可以使用memset()标题中的string.h函数,这样

memset(&(m->pc_last_known_position), 0, sizeof(m->pc_last_known_position));
memset(&(m->npc_position), 0, sizeof(m->pc_last_known_position));
相关问题