Maison > développement back-end > C++ > L'ajout de pointeur n'est-il pas défini lorsque vous ne pointez pas sur un tableau de caractères en C 17 ?

L'ajout de pointeur n'est-il pas défini lorsque vous ne pointez pas sur un tableau de caractères en C 17 ?

Linda Hamilton
Libérer: 2024-11-11 11:48:03
original
524 Les gens l'ont consulté

Is Pointer Addition Undefined When Not Pointing to a Character Array in C  17?

L'ajout de pointeurs n'est-il pas défini lorsqu'il ne pointe pas vers un tableau de caractères ?

La norme C 17 stipule que l'ajout de valeurs intégrales aux pointeurs entraîne un pointeur du même type que l'opérande, et le résultat pointe vers un élément (hypothétique) dans un tableau si l'opération reste dans ses limites. Cependant, il reste difficile de savoir si cela s'applique aux pointeurs qui ne pointent pas vers des tableaux de caractères.

Considérez le 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 ligne marquée d'un (*) constitue-t-elle un comportement indéfini ( UB) ? Le pointeur p pointe vers un flottant et non vers un tableau de caractères. Selon le paragraphe cité, cela devrait aboutir à UB. Cependant, s'il s'agissait d'UB, cela limiterait considérablement l'utilité de offsetof().

La définition standard des types trivialement copiables indique que leurs octets sous-jacents peuvent être copiés dans un tableau de caractères à l'aide de fonctions telles que std::memcpy . Cela implique que l'ajout doit être défini pour les pointeurs vers les octets bruts qui composent un objet, que le résultat soit utilisé ou non pour copier des octets dans un tableau.

Si cela implique que les octets impliqués forment déjà un tableau ou constituer une exception particulière aux règles habituelles pour l'opérateur n'est pas clair. Cependant, l’une ou l’autre interprétation rendrait valide l’ajout dans le code. Ainsi, on peut conclure que l'ajout d'un pointeur char * n'entraîne pas nécessairement UB, même s'il ne pointe pas vers un tableau char.

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