2016-08-04 4 views
2

Я создал структуру под названием «Регистр», вокруг которой находится около 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

@iwin Вы имели в виду гибкий элемент массива? –

+0

Другим возможным решением является объединение различных возможностей регистра. – ikegami

+0

@ikegami union могут быть использованы инструменты с меньшими регистрами, отнимающими много памяти. – 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); 
} 
Смежные вопросы