Maison > développement back-end > C++ > L'arithmétique des pointeurs sur les tableaux non-caractères est-elle définie par C ?

L'arithmétique des pointeurs sur les tableaux non-caractères est-elle définie par C ?

Linda Hamilton
Libérer: 2024-11-09 09:59:02
original
956 Les gens l'ont consulté

Is Pointer Arithmetic on Non-Character Arrays in C   Defined Behavior?

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);
Copier après la connexion

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!

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