C membre du tableau Struct sans longueur spécifique

J’ai rencontré ce morceau de code:

struct test { uint32 num_fields; char array_field []; }; 

Comment puis-je comprendre array_field ? Est-ce une extension gcc pour le langage C?

Il s’agit d’une fonctionnalité C99, appelée membre de groupe flexible, qui est généralement utilisée pour créer un tableau de longueur variable.

Il ne peut être spécifié qu’en tant que dernier membre d’une structure sans spécifier la taille (comme dans array_field []; ).


Par exemple, vous pouvez faire ce qui suit et le membre arr aura 5 octets alloués pour cela:

 struct flexi_example { int data; char arr[]; }; struct flexi_example *obj; obj = malloc(sizeof (struct flexi_example) + 5); 

Ses avantages / inconvénients discutés ici:

Membres du tableau flexibles en C – mauvais?

De telles structures sont généralement allouées sur le tas avec une taille calculée, avec un code tel que:

 #include  struct test * test_new(uint32 num_fields) { size_t sizeBeforeArray = offsetof(struct test, array_field); size_t sizeOfArray = num_fields * sizeof(char); struct test * ret = malloc(sizeBeforeArray + sizeOfArray); if(NULL != ret) { ret->num_fields = num_fields; } return ret; }