用C语言在数组中存储相似的联合
我有一个联盟的定义如下:用C语言在数组中存储相似的联合,c,arrays,unions,C,Arrays,Unions,我有一个联盟的定义如下: typedef union opWord { struct { unsigned short ARE : 2; unsigned short opDest : 2; unsigned short opSource : 2; unsigned short opcode : 4; unsigned short group : 2; unsigned short u
typedef union opWord
{
struct
{
unsigned short ARE : 2;
unsigned short opDest : 2;
unsigned short opSource : 2;
unsigned short opcode : 4;
unsigned short group : 2;
unsigned short unused : 3;
} word;
unsigned short fullReg;
} opWord;
union {
opWord op;
immediate imm;
} instructions[1000];
和另一个非常相似的,仅在位字段排列上有所不同:
typedef union immediate
{
struct
{
unsigned short ARE : 2;
unsigned short imm : 13;
} word;
unsigned short fullReg;
} immediate;
这些数据是否可以以某种方式存储在同一个数组中,因为它们只随位的排列而变化
差不多
opWord instructions[1000]?
如果没有,有没有一种方法可以作为链表来完成?
我如何声明指针呢?您不能在同一数组中直接存储类型为
opWord
和immediate
的对象。您不能声明这样一个数组,如果您试图用指针转换和/或动态分配的空间来处理它,那么您将遇到严格的别名规则
您可以创建一个联合
类型,成员为opWord
和immediate
,并按照@jxh在注释中的建议创建该类型的数组。以最简单、最简洁的形式,可能如下所示:
typedef union opWord
{
struct
{
unsigned short ARE : 2;
unsigned short opDest : 2;
unsigned short opSource : 2;
unsigned short opcode : 4;
unsigned short group : 2;
unsigned short unused : 3;
} word;
unsigned short fullReg;
} opWord;
union {
opWord op;
immediate imm;
} instructions[1000];
您还可以考虑将两个并集类型合并为一个,并创建该类型的数组:
union instruction {
struct {
unsigned short ARE : 2;
unsigned short opDest : 2;
unsigned short opSource : 2;
unsigned short opcode : 4;
unsigned short group : 2;
unsigned short unused : 3;
} opWord;
struct {
unsigned short ARE : 2;
unsigned short imm : 13;
} immediate;
unsigned short fullReg;
};
union instruction instructions[1000];
这减少了所涉及的层数,这可能很有用,但代价是丢失两种指令的单独类型。您不能将类型为
opWord
和immediate
的对象直接存储在同一数组中。您不能声明这样一个数组,如果您试图用指针转换和/或动态分配的空间来处理它,那么您将遇到严格的别名规则
您可以创建一个联合
类型,成员为opWord
和immediate
,并按照@jxh在注释中的建议创建该类型的数组。以最简单、最简洁的形式,可能如下所示:
typedef union opWord
{
struct
{
unsigned short ARE : 2;
unsigned short opDest : 2;
unsigned short opSource : 2;
unsigned short opcode : 4;
unsigned short group : 2;
unsigned short unused : 3;
} word;
unsigned short fullReg;
} opWord;
union {
opWord op;
immediate imm;
} instructions[1000];
您还可以考虑将两个并集类型合并为一个,并创建该类型的数组:
union instruction {
struct {
unsigned short ARE : 2;
unsigned short opDest : 2;
unsigned short opSource : 2;
unsigned short opcode : 4;
unsigned short group : 2;
unsigned short unused : 3;
} opWord;
struct {
unsigned short ARE : 2;
unsigned short imm : 13;
} immediate;
unsigned short fullReg;
};
union instruction instructions[1000];
这样可以减少所涉及的层数,这可能很有用,但代价是丢失两种指令的单独类型。创建两个并集的并集?创建两个并集的并集?