tableaux de longueur nulle

cemment je suis tombé sur une définition de structure,

struct arr { int cnt; struct { int size; int *name; } list[0]; }; 

et maintenant je ne connais pas la raison pour laquelle la list[0] été déclarée. Ce qui m’intéresse, c’est pourquoi est-ce utilisé? At-il un avantage? Si oui, qu’est ce que c’est?

L’utilisation est pour les tableaux de longueur dynamic. Vous pouvez allouer la mémoire en utilisant malloc() et laisser le tableau résider à la fin de la structure:

 struct arr *my_arr = malloc(sizeof *my_arr + 17 * sizeof *my_arr->list); my_arr->cnt = 17; my_arr->list[0].size = 0; my_arr->list[1].name = "foo"; 

En réalité, pouvoir utiliser 0 pour la longueur est (comme indiqué dans un commentaire) une extension GCC. En C99, vous pouvez laisser de côté le littéral de taille pour le même effet.

Avant que ces choses ne soient mises en œuvre, vous voyiez souvent cela faire avec une longueur de 1, mais cela complique un peu l’allocation puisque vous devez compenser lorsque vous calculez la mémoire nécessaire.

Cela s’appelle “struct hack”. Vous pouvez le rechercher sur SO ou sur le Net

http://www.google.com/search?q=struct+hack&sitesearch=stackoverflow.com/questions

Notez formellement qu’il est toujours illégal de déclarer des tableaux de taille 0 en C. Le code que vous avez fourni officiellement n’est même pas compilable. Cependant, la plupart des compilateurs C acceptent la déclaration de tableau de taille 0 comme extension, en particulier parce qu’elle est souvent utilisée dans la version “lazy” de “struct hack” (elle peut compter sur sizeof pour déterminer la quantité de mémoire à allouer, car un tableau de taille 0 n’affecte apparemment pas la taille totale de la structure).

Une implémentation sans doute meilleure de struct hack utilise un tableau de taille 1

 struct arr { int cnt; struct { int size; int *name; } list[1]; }; 

C’est “meilleur” parce qu’il est au moins formellement compilable. Afin d’allouer de la mémoire pour une structure avec N éléments dans la list , la macro standard offsetof est utilisée

 arr *a = malloc(offsetof(arr, list) + N * sizeof a->list); 

Dans la version C99 de la spécification du langage, la “struct hack” est prise en charge par la déclaration de tableau sans taille (avec empty [] ), car les déclarations de tableau de taille 0 sont également illégales en C99.

Un autre avantage est que votre structure décrit des données sur disque / sur réseau. Si cnt est 0, la taille des données ne peut être que la longueur de cnt .

Je suis ici juste pour confirmer ce que je redoutais, cette list[0] n’est pas valide.