2016-08-04 149 views
2

我創建了一個名爲Register的結構,其中包含大約8個字段。我現在想要創建一個名爲Instrument的結構,它應該有一個可變數量的字段,這對每個儀器來說都是相同的,再加上一定數量的字段,這取決於歸因於它的寄存器數量。我如何創建這個?改變結構的大小?

爲了清楚起見,我想創建(雖然可能不準確)。

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

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

@iwin是否指彈性數組成員? –

+0

另一個可能的解決方案是不同寄存器可能性的聯合。 – ikegami

+0

@ikegami工會可以使用少regs的儀器浪費大量的記憶。 – LPs

回答

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; 
+0

謝謝,會使用malloc()嗎?如果是這樣,我將如何以及在哪裏去做這件事? – Mst137

+0

@ Mst137我沒有得到你想要知道的東西......你是在談論上面的例子嗎? –

+0

對不起,我沒有看到當時的例子,那很好。謝謝! – Mst137

2

您可以使用指針

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

使用它INT o代碼

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