Arithmétique des pointeurs sur les tableaux sans caractères
En C, le comportement de l'arithmétique des pointeurs est bien défini pour les pointeurs qui font référence à des tableaux ou pointent au début d'un tableau. Cependant, des questions se posent lorsque l'arithmétique des pointeurs est appliquée à des pointeurs qui ne pointent pas directement vers des tableaux de caractères.
Considérez l'extrait de code suivant :
struct Foo { float x, y, z; }; Foo f; char *p = reinterpret_cast<char *>(&f) + offsetof(Foo, z);
La ligne problématique marquée d'un (*) attribue l'adresse du membre z de la structure Foo au pointeur p. Selon la norme (expr.add/4), cette opération pourrait être considérée comme un comportement indéfini (UB) puisque p ne pointe pas vers un tableau de caractères.
Cependant, la norme indique également que les octets sous-jacents de tout un objet trivialement copiable peut être copié dans un tableau de caractères ou de caractères non signés. Cela implique que l'arithmétique des pointeurs doit être valide pour les pointeurs vers les octets bruts qui composent un objet, qu'ils forment ou non un tableau.
Dans ce cas spécifique, l'intention derrière le code est d'accéder au membre z. en utilisant réinterpréter_cast. Bien que la norme n'indique pas explicitement que l'arithmétique des pointeurs est définie dans de tels scénarios, cela limiterait considérablement l'utilité de offsetof si ce n'était pas le cas.
Par conséquent, l'ajout à la ligne (*) est considéré valide en C . L'arithmétique du pointeur sur p est autorisée et elle pointe correctement vers le membre z dans la structure Foo.
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!