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
Linda Hamiltonoriginal
2024-12-25 16:46:18190parcourir

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";

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

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

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!

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