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

L'arithmétique des pointeurs sur les pointeurs non-tableaux avec un comportement « reinterpret_cast » n'est-il pas défini ?

Patricia Arquette
Libérer: 2024-11-08 15:12:01
original
1016 Les gens l'ont consulté

Is Pointer Arithmetic on Non-Array Pointers with `reinterpret_cast` Undefined Behavior?

L'arithmétique des pointeurs avec des pointeurs non-tableaux a-t-elle un comportement non défini ?

La norme C spécifie que l'ajout ou la soustraction d'une expression intégrale à un pointeur entraîne dans un pointeur du même type. Cependant, si le pointeur pointe initialement vers un élément dans un tableau, le pointeur résultant doit également pointer vers un élément valide dans le tableau. Cela soulève la question : est-ce un comportement indéfini (UB) à ajouter à un pointeur "char *" qui ne pointe pas réellement vers un tableau 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

Line () effectue un reinterpret_cast pour convertir l'adresse de f en un pointeur "char ", puis ajoute le décalage du membre z. Le pointeur résultant p est utilisé pour modifier la valeur de f.z.

Selon la norme, cette ligne devrait donner UB car p ne pointe pas vers un tableau de caractères. Cependant, il est communément admis qu'il est permis d'utiliser de tels pointeurs pour manipuler la représentation mémoire sous-jacente des objets.

La norme n'indique pas explicitement qu'il s'agit d'UB, mais elle exige que les objets de types trivialement copiables puissent être copié dans un tableau de caractères ou de caractères non signés. Cela suggère que l'arithmétique des pointeurs devrait être définie pour les pointeurs vers les octets bruts qui composent un objet, permettant l'opération ci-dessus.

Par conséquent, il est raisonnable de conclure que l'ajout à un pointeur "char *" qui ne 'ne pas pointer vers un tableau de caractères n'est pas UB dans les scénarios où les octets sous-jacents sont destinés à être copiés dans un tableau.

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