C: Style recommandé pour les structures de taille dynamic

J’ai besoin de transférer des paquets via Internet dont la longueur doit être dynamic.

struct packet { int id; int filename_len; char filename[]; }; 

Le problème est que les tableaux de longueur nulle ne sont pas conformes à la norme ISO.

Devrais-je utiliser char filename[1]; au lieu? Mais alors sizeof(struct packet) ne retournera plus la valeur correcte.

    Problème classique. Vous pouvez simplement vous en occuper (et notez que sizeof (foo) peut être décalé de plusieurs si le compilateur arrondit la taille de la structure, ce qui est (je crois) autorisé), ou vous pouvez faire quelque chose comme ceci:

     struct packetheader { int id; int filename_len; }; struct packet { struct packetheader h; char filename[1]; }; 

    C’est agaçant (vous devez utiliser h.id, etc.), mais cela fonctionne. Habituellement, je ne traite qu’en étant un, mais ce qui précède pourrait être légèrement plus portable.

    Je pense que vous devriez regarder quelques exemples existants de structures de taille dynamic pour les guider ici. Le meilleur exemple que je connaisse sont les API TOKEN dans Win32. Ils utilisent la macro ANYSIZE_ARRAY qui se résout juste à 1. Raymond Chen a rédigé un article de blog détaillé expliquant précisément pourquoi ils sont réalisés de cette manière.

    En ce qui concerne les opérations telles que la taille d’échec. Cela échouera quelle que soit la solution choisie pour une structure de taille dynamic. sizeof est une opération de compilation et vous redimensionnerez la structure au moment de l’exécution. Cela ne peut tout simplement pas fonctionner.

    Je suggère d’utiliser char filename[1] et d’inclure un octet final 0. De cette façon, vous pouvez malloc() la taille de structure correcte avec malloc() et éviter les erreurs ponctuelles comme celle-ci:

     ptr = malloc(sizeof(struct packet)+filename_len); strncpy(&ptr->filename, filename, filename_len); 

    Mais le destinataire doit savoir qu’il doit lire filename_len+1 octet.

    En effet, les tableaux de longueur nulle ne font pas partie de la norme. Mais ce que vous avez dans votre extrait de code est un tableau flexible qui fait partie de la norme ISO C99. S’il vous est possible d’utiliser C99, j’utiliserais un tableau flexible. Sinon, la suggestion de jesup est probablement la meilleure.