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