3 votes

La soustraction de pointeurs ne pointant pas vers des éléments différents d'un même tableau est-elle valide en C ?

La soustraction de pointeurs ne pointant pas vers des éléments différents d'un même tableau est-elle valide en C ?

Le fonctionnement d'un produit tel que celui présenté ci-dessous est-il garanti conformément aux normes C ? Je me souviens vaguement avoir lu que ce n'était pas valable ?

int * a;
int * b;
a = (int*) 100;
b = (int*) 200;
printf("%d\n", b-a);

Cela me permettra-t-il d'obtenir 25.

6voto

Carl Norum Points 114072

Extrait de la spécification C, annexe J.2 Comportement non défini :

Les pointeurs qui ne pointent pas dans le même objet de tableau, ou juste au-delà, sont soustraits (6.5.6).

6.5.6 Opérateurs additifs Le paragraphe 9 stipule que

Lorsque deux pointeurs sont soustraits, ils doivent tous deux pointer sur des éléments du même tableau ou sur un élément situé après le dernier élément du tableau ; le résultat est la différence des indices des deux éléments du tableau.

Voilà, votre exemple provoque un comportement non défini. Cela dit, sur la plupart des systèmes, il fonctionnera parfaitement. Il est probable que vous faire voulez changer votre printf au format %td pour indiquer que vous imprimez un ptrdiff_t type.

4voto

Luchian Grigore Points 136646

Il s'agit d'un comportement non défini.

Tout d'abord, ces pointeurs ne pointent pas vers la mémoire que vous possédez.

Vous ne pouvez soustraire que des pointeurs qui pointent à l'intérieur du même tableau (ou une position après la fin du tableau).

Bien entendu, cela fonctionnera probablement avec la plupart des compilateurs, et vous obtiendrez 25 porque sizeof(int) == 4 sur votre plateforme. S'ils étaient char * vous obtiendrez 100. (éventuellement, ou il pourrait se planter, c'est la beauté de l'UB).

0voto

Matthias Points 4949

Même si la norme ne promet pas un comportement défini, le résultat est correct. Un entier nécessite dans votre architecture 4 octets. Ainsi, la différence vous donne le nombre de entier les deux pointeurs sont éloignés l'un de l'autre. Vous pouvez utiliser la différence comme un index ou un décalage dans un tableau. Pour la même raison

  int *p = (int*) 100;
  p++;

se traduira par p=104.

0voto

n.m. Points 30344

Bien sûr, il n'est pas défini. La soustraction de deux pointeurs arbitraires (considérés comme des entiers) n'est même pas garantie d'être un multiple de la taille de votre objet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X