Allocation de mémoire en C : pouvez-vous allouer un tableau vide ?
En C, l'allocation de mémoire pour les tableaux peut être effectuée dynamiquement à l'aide de l'option nouvel opérateur. Cependant, que se passe-t-il lorsque vous allouez un tableau de taille zéro ?
cout << new int[0] << endl;
Est-ce que cela allouera de la mémoire pour un bloc vide ? Explorons le point de vue de la norme.
Interprétation standard
Selon la norme C (5.3.4/7), « Lorsque la valeur de l'expression dans un direct- new-declarator est nul, la fonction d'allocation est appelée pour allouer un tableau sans éléments."
Problèmes de déréférencement
Cependant, la norme (3.7.3.1/2) indique explicitement que « l'effet du déréférencement d'un pointeur renvoyé sous la forme d'une demande de zéro la taille n'est pas définie." Cela signifie que même s'il est techniquement possible d'allouer un tableau vide, tenter d'accéder à ses éléments (par exemple, en déréférençant le pointeur renvoyé) est un comportement non défini.
Notes supplémentaires
Même si la norme autorise l'allocation de tableaux vides, elle souligne que les requêtes de mémoire de taille nulle peuvent toujours échouer. En effet, l'allocation dynamique de mémoire peut s'appuyer sur des bibliothèques système externes (telles que malloc()) qui peuvent avoir leur propre gestion de telles requêtes.
Implications et meilleures pratiques
En pratique, il est généralement considéré comme une bonne pratique d'éviter d'allouer des tableaux vides. Le comportement n'est pas défini et peut conduire à des résultats inattendus sur différentes plates-formes et environnements. Si vous devez gérer des scénarios dans lesquels un conteneur vide est nécessaire, envisagez d'utiliser des approches alternatives telles que l'utilisation d'un std :: vector ou std :: array d'une taille nulle.
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!