19Fermer21
PpHdLe 04/01/2014 à 22:36
squalyl (./16) :
oui mais si a est déclaré comme tableau, ça marche SEULEMENT pour des nombres positifs! Enfin presque, je m'explique:

avec les déclarations:

int a[]
int *b=a;
int offset;

a+1 est défini, et donne le même code asm que b+1
MAIS
a-1 est TOTALEMENT indéfini et le compilateur peut générer ce qu'il veut, de nop à reboot en passant par system("format c: /y") grin

alors que b-1 fonctionne

a noter que dans tous les cas, a+offset et a-offset ne pose pas de problème et fonctionne comme b+offset et b-offset, car le compilo ne peut rien optimiser!

On a rencontré un compilateur embarqué qui générait de la merde (non destructive, mais non fonctionnelle grin) pour l'expression tableau-offset. Et on n'a pas pu dire que c'était un bug de compilo, parce que ce n'est pas défini par l'ISO C. Mon collègue en a eu la confirmation sur le newsgroup comp.lang.c grin

c'est la seule différence que je connaisse entre tableau et pointeur triso


Norme C, chapitre 6.5.2.1 :

The definition of the subscript operator [] is that E1[E2] is identical to (*((E1)+(E2))).

Donc, c'est vraiment 100% équivalent.

Norme C, chapitre 6.5.6.8

If both the pointer operand and the result point to elements of the same array object, or one past the last element of the array object, the evaluation shall not produce an overflow; otherwise, the behavior is undefined.

*(b-1) n'est pas censé fonctionner puisque que 'b' et 'b-1' n'appartienne pas au même tableau.