Maison > développement back-end > C++ > le corps du texte

L'ajout à un pointeur 'char *' a-t-il un comportement non défini lorsqu'il ne pointe pas vers un tableau ?

Linda Hamilton
Libérer: 2024-11-10 14:41:02
original
469 Les gens l'ont consulté

Is Adding to a

Ajout à un pointeur "char *" : UB ou pas ?

Le C 17 définit des règles d'ajout d'expressions intégrales aux pointeurs, précisant que un comportement non défini se produit lorsque le résultat dépasse les limites d'un tableau pointé. Cependant, la définition concerne spécifiquement les pointeurs pointant vers des éléments de tableaux.

Considérez l'extrait de code suivant :

struct Foo {
    float x, y, z;
};

Foo f;
char *p = reinterpret_cast<char *>(&f) + offsetof(Foo, z); // (*)
*reinterpret_cast<float *>(p) = 42.0f;
Copier après la connexion

La question se pose de savoir si la ligne (*) déclenche un comportement non défini. Malgré la réinterprétation de l'adresse d'un float en tant que pointeur char, elle ne pointe pas vers un tableau char. Ainsi, selon la définition citée, il semblerait s’agir d’un comportement indéfini. Pourtant, l'utilité de la macro offsetof serait gravement compromise si tel était le cas.

Cependant, C permet également de copier les octets sous-jacents de tout type trivialement copiable dans un tableau de caractères. Cette opération, qui peut être effectuée à l'aide de fonctions comme std::memcpy ou manuellement octet par octet, ne nécessite pas que l'objet d'origine soit un tableau.

Par conséquent, pour permettre à ces opérations par octet de réussir, le l'ajout d'expressions intégrales aux pointeurs doit être défini pour les pointeurs pointant vers les octets bruts des objets. Il n'est pas clair si ces octets forment implicitement un tableau ou constituent une exception spéciale aux règles générales d'addition. Néanmoins, l’une ou l’autre interprétation justifierait la validité de l’ajout dans l’exemple de code fourni. Par conséquent, l'ajout d'un pointeur "char *" dans ce contexte n'entraîne pas de comportement indéfini.

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