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