2

可以做这样的事情如何初始化指向结构的指针数组? 但有不同的结构?

例如

static struct structA_t a = {"ads", "as"};
static struct structB_t b = {"zzds", "dfr", "shywsd"};
static struct structC_t c = {"ssa", "ad", "dhksdhs"};

struct some_type *array[] = { &a, &b, &c};

some_type 会是什么样子?

4

2 回答 2

8

您可以定义some_type为联合:

typedef union{
  struct structA_t;
  struct structB_t;
  struct structC_t;
}some_type;

这将导致您不知道数组中哪个元素实际包含什么的问题。

为了克服这个问题,添加另一个字段来指定使用的内容:

/* numbers to identify the type of the valid some_type element */
typedef enum my_e_dataId{
  dataid_invalid = 0,
  dataid_a,
  dataid_b,
  dataid_c
} my_dataId;

typedef union u_data {
  struct structA_t* a;
  struct structB_t* b;
  struct structC_t* c;
}mydata;

typedef struct s_some_type{
  my_dataId dataId;
  mydata    myData;
}some_type;

然后你可以按如下方式初始化你的数组:

some_type sta[] = {
  {dataid_a, (struct structA_t*) &a},
  {dataid_b, (struct structA_t*) &b},
  {dataid_c, (struct structA_t*) &c}
};

当您遍历 的元素时array,首先评估dataId,以便您知道myData. 然后,例如,使用访问第一个元素的数据

sta[0].myData.a->FIELDNAME_OF_A_TO_ACCESS

或第三个元素

sta[2].myData.c->FIELDNAME_OF_C_TO_ACCESS

有关工作示例,请参阅此 ideone:http: //ideone.com/fcjuR

于 2012-08-06T14:05:43.807 回答
1

在 C 中,使用 void 指针可以做到这一点(用“void”替换“struct some_type”),但你真的不应该这样做。数组用于使用同质数据进行编程。

于 2012-08-06T14:08:45.757 回答