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

または3番目の要素

sta[2].myData.c->FIELDNAME_OF_C_TO_ACCESS

実用的な例については、このideoneを参照してください:http://ideone.com/fcjuR

于 2012-08-06T14:05:43.807 に答える
1

Cでは、これはvoidポインタで可能です(「structsome_type」を「void」に置き換えてください)が、実際にはこれを行うべきではありません。配列は、同種のデータを使用したプログラミング用です。

于 2012-08-06T14:08:45.757 に答える