Maison >développement back-end >C++ >Des tableaux de taille variable peuvent-ils être alloués sur la pile en C ?

Des tableaux de taille variable peuvent-ils être alloués sur la pile en C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-28 00:10:08800parcourir

Can Variable-Sized Arrays Be Allocated on the Stack in C  ?

Tableaux de taille variable sur la pile : démystifier un mythe de programmation

Le concept de tableaux dont les tailles sont déterminées au moment de l'exécution a longtemps été considéré comme un tabou de la programmation, particulièrement en C . La sagesse commune veut que seules des constantes puissent définir les tailles des tableaux automatiques et statiques. Cependant, un extrait de code récent remet en question cette notion.

Considérez le code suivant :

int main(int argc, char **argv) {
    size_t size;
    cin >> size;
    int array[size];
    ...
}

Malgré l'absence d'opérateurs d'allocation de mémoire dynamique tels que new ou malloc, ce code se compile et s'exécute sans erreurs. Comment est-ce possible ?

La clé réside dans la norme C99, qui a introduit la prise en charge des tableaux de taille variable sur la pile. Dans ce cas, le compilateur alloue le tableau sur la pile de manière dynamique, tout comme il le ferait avec un tableau de taille constante déclaré comme int array[100].

Il est important de noter que ceci est fondamentalement différent de l'allocation de tas. en utilisant malloc ou new. GCC, en particulier, alloue le tableau sur la pile, modifiant le pointeur de pile en conséquence. Cela élimine le besoin d'allocation de tas et ressemble au comportement de la fonction _alloca.

Bien que cette construction ne soit pas prise en charge dans les anciens compilateurs, elle devient de plus en plus répandue dans les implémentations C modernes. Il fournit un moyen pratique et efficace d'allouer des tableaux de tailles connues au moment de l'exécution.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn