改变结构的大小?

时间:2016-08-04 14:22:20

标签: c structure flexible-array-member

我创建了一个名为Register的结构,其中包含大约8个字段。我现在想要创建一个名为Instrument的结构,它应该具有可变数量的字段,6对于每个乐器都是相同的,加上一定数量的字段取决于归属于它的寄存器数量。我该如何创建呢?

为了清楚起见,这是我想要创建的内容(尽管可能不准确)。

    typedef struct {
   int    x;
   int    y;
   int    z;
} Register;

 typedef struct {
       int    x;
       int    y;
       int    z;
       Register Reg1;
       Register Reg2;
       ...
    } Instrument;

2 个答案:

答案 0 :(得分:5)

您可以使用flexible array members来实现相同目标。

这样的东西
typedef struct {
       int    x;
       int    y;
       int    z;
       Register Reg1;
       Register Reg2;  //upto this is fixed....
       Register Reg[];
       } Instrument;

然后,您可以根据需要将内存分配给someVar.Reg

例如,引用C11,章节§6.7.2.1/ 20

  

示例2 声明后:

   struct s { int n; double d[]; };
     

结构struct s具有灵活的数组成员d。使用它的典型方法是:

int m = /* some value */;
struct s *p = malloc(sizeof (struct s) + sizeof (double [m]));
     

并假设对malloc的调用成功,p指向的对象在大多数情况下表现得好像   p已被声明为:

struct { int n; double d[m]; } *p;

答案 1 :(得分:2)

您可以使用指针

typedef struct 
{
   int    x;
   int    y;
   int    z;
   Register *reg;
} Instrument;

将其用于代码

Instrument a.reg = malloc(sizeof(Register)*NUM_OF_REGISTERS);
if (a.reg != NULL)
{
   // your STUFF
   free(a.Reg);
}