Mon professeur de programmation de systèmes sûr, je suis prenant nous a dit aujourd'hui de définir une structure avec un zéro-longueur de tableau à la fin:
struct array{
size_t size;
int data[0];
};
typedef struct array array;
C'est un bon struct de définir ou d'initialiser un tableau avec une variable, c'est à dire, quelque chose comme suit:
array *array_new(size_t size){
array* a = malloc(sizeof(array) + size * sizeof(int));
if(a){
a->size = size;
}
return a;
}
C'est, en utilisant malloc()
, nous avons également allouer de la mémoire pour le tableau de taille zéro. C'est complètement nouveau pour moi, et il me semble bizarre, parce que, selon ma compréhension, les structures ne disposent pas de leurs éléments nécessairement en continu dans des endroits.
Pourquoi le code en array_new
allouer de la mémoire à l' data[0]
? Pourquoi serait-il légal d'accès, disons
array * a = array_new(3);
a->data[1] = 12;
?
À partir de ce qu'il nous a dit, il semble qu'un tableau défini comme la longueur de zéro à la fin d'une struct est assurée à venir immédiatement après le dernier élément de la structure, mais cela semble étrange, parce que, de nouveau, à partir de ma compréhension, les structures pourrait avoir de remplissage.
J'ai aussi vu partout que c'est juste une caractéristique de la gcc et n'est pas définie par une norme. Est-ce vrai?