Maison > développement back-end > C++ > Pourquoi la conversion du littéral de chaîne directe en `char*` est-elle autorisée en C mais obsolète en C ?

Pourquoi la conversion du littéral de chaîne directe en `char*` est-elle autorisée en C mais obsolète en C ?

Linda Hamilton
Libérer: 2024-12-25 16:46:18
original
193 Les gens l'ont consulté

Why is Direct String Literal to `char*` Conversion Allowed in C but Deprecated in C  ?

Pourquoi la conversion littérale de chaîne en 'char*' est autorisée en C mais obsolète en C

En C, il est valide d'attribuer un chaîne littérale directement vers un pointeur 'char*', comme indiqué ci-dessous :

char* p = "abc";
Copier après la connexion

Cependant, en C 11 et au-delà, cette conversion implicite a été supprimée en raison de son potentiel à conduire à un comportement indéfini si la chaîne littérale est modifiée. La norme C indique explicitement au § C.1.1 que l'exemple ci-dessus n'est désormais plus valide.

Pour résoudre ce problème, C autorise une conversion explicite pour convertir une chaîne littérale en un pointeur 'char*'. Cette distribution indique clairement que le programmeur comprend les risques potentiels et accepte la responsabilité de toutes les conséquences qui pourraient survenir.

char* p = (char*)"abc"; // Valid with explicit cast
Copier après la connexion

La distribution explicite en C sert à deux fins :

  1. Elle supprime l'avertissement du compilateur qui serait autrement généré en raison de la conversion implicite obsolète.
  2. Il oblige le programmeur à reconnaître le potentiel d'un comportement non défini si la chaîne littérale est modifié.

Cependant, il est important de noter que même avec la conversion explicite, l'attribution d'une chaîne littérale à un pointeur 'char' n'est toujours pas considérée comme une bonne pratique en C . L'approche la plus sûre consiste à utiliser un pointeur 'const char', qui indique explicitement que le littéral de chaîne ne doit pas être modifié :

char const *p = "abc"; // Valid and safe
Copier après la connexion

Cela garantit que le littéral de chaîne restera inchangé, empêchant ainsi toute modification potentielle indéfinie. comportement.

En C, la conversion implicite d'une chaîne littérale en un pointeur 'char*' reste valide en raison de la grande quantité de code hérité qui repose sur ce comportement. Supprimer la conversion implicite en C aurait brisé un nombre important de programmes existants.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal