可以做这样的事情How can I initialize an array of pointers to structs? 但是结构不同?
E.g。
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的外观如何?
答案 0 :(得分: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
答案 1 :(得分:1)
在C中,这可以使用void指针(将“struct some_type”替换为“void”),但是你真的不应该这样做。数组用于使用同类数据进行编程。