Maison  >  Article  >  développement back-end  >  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
Linda Hamiltonoriginal
2024-11-09 09:59:02914parcourir

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

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!

Déclaration:
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