【问题标题】:Array of pointers to different structs指向不同结构的指针数组
【发布时间】:2012-08-03 12:20:39
【问题描述】:

可以做这样的事情How can I initialize an array of pointers to structs? 但结构不同?

例如

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 会是什么样子?

【问题讨论】:

  • 我认为您对“数组”一词在 C 中的含义感到困惑。
  • 数组表示相同数据类型的元素集合。
  • 说明你的问题定义为什么你需要这样的东西会让这个问题变得更好,还是只是你的好奇心?
  • C 不太适合这个。您正在尝试做的是实现一个“包”,这迫切需要一种具有运行时多态性的面向对象语言。
  • 我只是希望可以创建一组不同的结构和数组,其中包含指向该结构的指针,以及另一个包含指向结构成员的指针的数组(索引将是#defined)。所有这一切都是为了一个用于管理我的结构元素的函数以及全部在 C 中。

标签: c arrays pointers struct


【解决方案1】:

您可以将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

【讨论】:

  • 很好的答案,但将#defines 换成枚举。
  • 枚举更安全。 #define 擅长覆盖事物,包括枚举、其他 #define 甚至变量名,而枚举在发生此类冲突时会产生真正的编译错误。
  • enum {a = 4}; enum {a = 5}; 是一个编译错误,这就是我所指的那种情况,这就是 enum 优于 #define 的原因。
  • @eckes 我现在意识到您仍然拥有只有一种结构的数组。这将不起作用,这将是目标(我的意思是下面的代码将是目标): some_type sta[] = { {dataid_a, (struct structA_t*) &a}, {dataid_b, (struct structB_t*) &b}, {dataid_c, (struct structC_t*) &c} };
  • @bienieck:转换为struct structA_t* 只需要满足编译器的要求(否则会产生警告)。 其实,数组中存储的数据是正确的。见ideone:ideone.com/fcjuR
【解决方案2】:

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

【讨论】:

  • 正如你所说,不应该这样做。人们如何能够区分哪个索引存在什么类型的元素?
  • 好吧,switch 语句是原始多态性,可以添加第二个类型枚举数组或用上面的答案中的标识符包装在一个联合中,但这确实回答了这个问题.
猜你喜欢
  • 1970-01-01
  • 2017-06-03
  • 2012-12-07
  • 2016-06-20
  • 1970-01-01
相关资源
最近更新 更多