Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指向不同结构的指针数组_C_Arrays_Pointers_Struct - Fatal编程技术网

C 指向不同结构的指针数组

C 指向不同结构的指针数组,c,arrays,pointers,struct,C,Arrays,Pointers,Struct,这样做是可能的 但结构不同 例如 某些类型将是什么样子?您可以将某些类型定义为一个联合体: 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 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以获得一个工作示例:

您可以将
某些类型定义为一个联合体:

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以获得一个工作示例:

在C中,这可以通过void指针实现(将“struct some_type”替换为“void”),但您确实不应该这样做。数组用于使用同质数据编程。

在C中,这可以通过void指针实现(将“struct some_type”替换为“void”),但您确实不应该这样做。数组用于使用同质数据进行编程。

我认为您对C中的“数组”一词的含义感到困惑。数组指的是一组相同数据类型的元素。说明您的问题定义,比如为什么需要这样的东西,会使这成为一个更好的问题,或者只是您的好奇心?C不太适合这个问题。你要做的是实现一个“包”,这需要一种具有运行时多态性的面向对象语言。我只是希望可以创建一组不同的结构和数组,其中包含该结构的指针,以及另一组包含指向结构成员的指针的数组(将定义索引)。所有这些都是一个用于管理我的结构元素和C语言中的所有元素的函数。我认为您对术语“数组”的含义感到困惑在C中表示。数组表示相同数据类型的一组元素。说明您的问题定义,说明为什么需要这样的东西,会使这成为一个更好的问题,或者只是您的好奇心?C不太适合这个问题。你要做的是实现一个“包”,这需要一种具有运行时多态性的面向对象语言。我只是希望可以创建一组不同的结构和数组,其中包含该结构的指针,以及另一组包含指向结构成员的指针的数组(将定义索引)。所有这些都是为了一个函数来管理我的结构的元素,所有这些都是用C语言编写的。正如你所说的,不应该这样做。这个人怎样才能区分在哪个索引处存在什么类型的元素呢?好吧,switch语句是原始多态性,可以添加第二个类型枚举数组,或者像上面的答案那样使用标识符包装在一个联合中,但这确实回答了这个问题。正如你所说的,不应该这样做。这个人将如何区分在哪个索引处存在什么类型的元素?好吧,switch语句是原始多态性,可以添加第二个类型枚举数组,或者像上面的答案那样用标识符包装在一个联合中,但这确实回答了这个问题。回答得好,但是换掉枚举的#定义。枚举更安全#define擅长写一些东西,包括enum、其他#define,甚至变量名,而enum在发生此类冲突时会产生真正的编译错误。
enum{a=4};枚举{a=5}
是一个编译错误,这就是我所指的那种情况,这也是为什么enum比#define更受欢迎的原因。@eckes我现在意识到,仍然有数组只有一种结构类型。这将不起作用,这将是目标(我的意思是下面的代码将是目标):一些类型的sta[]={{dataid_a,(struct structA_t*)&a},{dataid_b,(struct structB_t*)&b},{dataid_c,(struct_t*)&c}@bienieck:cast to
struct structA\u t*
只需要满足编译器的要求(否则将产生警告)。实际上,数组中存储的数据是正确的。请参阅ideone:答案很好,但将#定义替换为枚举。枚举更安全#define擅长写一些东西,包括enum、其他#define,甚至变量名,而enum在发生此类冲突时会产生真正的编译错误。
enum{a=4};枚举{a=5}
是一个编译错误,这就是我所指的那种情况,这也是为什么enum比#define更受欢迎的原因。@eckes我现在意识到,仍然有数组只有一种结构类型。这将不起作用,这将是目标(我的意思是下面的代码将是目标):一些类型的sta[]={{dataid_a,(struct structA_t*)&a},{dataid_b,(struct structB_t*)&b},{dataid_c,(struct_t*)&c}@bienieck:cast to
struct structA\u t*
只需要满足编译器的要求(否则将产生警告)。实际上,数组中存储的数据是正确的。见表意文字: