déclarer un tableau de longueur variable en tant que variable globale en C

Comment est-il possible de déclarer un tableau de longueur variable en tant que variable globale?

lorsqu’un tableau de longueur variable est déclaré dans une fonction avant que la longueur ne soit analysée, il est compilé mais ne s’exécute pas. cela donne un défaut de segmentation. lorsque la même instruction de déclaration est décalée par rapport à l’instruction d’parsing, tout fonctionne correctement.

si nous voulons un tableau de longueur variable disponible globalement pour toutes les fonctions, comment pouvons-nous le faire? Le problème ici est que la longueur du tableau ne peut être analysée que par certaines fonctions.

Tu ne peux pas faire ça. Voici ce que dit le projet de norme:

6.7.6.2 Déclarateurs de tableau

2 Si un identificateur est déclaré comme ayant un type modifié de manière variable, il doit s’agir d’un identificateur ordinaire (tel que défini au 6.2.3), ne pas avoir de liaison et avoir une scope de bloc ou une scope de prototype de fonction. Si un identificateur est déclaré être un object ayant une durée de stockage statique ou de thread, il ne doit pas avoir de type tableau de longueur variable.

Également,

10 EXEMPLE 4 Toutes les déclarations de types modifiés de manière variable (VM) doivent être à la scope du bloc ou du prototype de la fonction. Les objects de tableau déclarés avec le spécificateur _Thread_local, static ou extern storage-class ne peuvent pas avoir un type de tableau de longueur variable (VLA). Toutefois, un object déclaré avec le spécificateur de classe de stockage statique peut avoir un type de machine virtuelle (c’est-à-dire un pointeur sur un type de VLA). Enfin, tous les identifiants déclarés avec un type de VM doivent être des identifiants ordinaires et ne peuvent donc pas être membres de structures ou de unions.

Un tableau de longueur variable (c’est-à-dire un tableau dont la taille correspond à une valeur d’exécution) ne peut pas être une variable globale car l’expression que vous utilisez pour la taille doit évidemment être calculée lors de la compilation. Il ne peut vivre que sur la stack. Vraisemblablement, vous obtenez un tableau statique dont la taille dépend de l’endroit où vous le définissez dans le code (car vous redéfinissez quelque chose dont il dépend).

Pourquoi ne pouvez-vous pas simplement utiliser un pointeur global et realloc () pour le dimensionner au besoin?

Il n’y a aucun moyen de déclarer un tableau de longueur variable en tant que variable globale en C car il devrait être alloué avant de connaître sa taille pour que le compilateur ne sache pas combien de mémoire il devrait lui allouer. Ce que vous pouvez (et devriez) faire, cependant, est de l’allouer dynamicment:

char* my_dynamic_array = NULL; void f(unsigned int size) { if(!my_dynamic_array) { my_dynamic_array = malloc(size); } /* do something with the array */ } int main(void) { f(1024); /* set size dynamically */ /* do something with the array */ free(my_dynamic_array); /* free the allocated memory */ return 0; }