la norme C est claire là-dessus : tu peux faire un peu ce que tu veux comme arithmétique de pointeurs (addition, sousraction) tant que les opérandes et le résultats pointent sur un élément de bloc (array object) existant ou l'élément juste suivant« one past the last element of the array object »)
Dans ton exemple, ça veut dire que l'on peut considérer i, i+1, et aussi i+2. Par contre la norme dit bien qu'on a pas le droit de déréférencer le i+2 « If the result points one past the last element of the array object, it shall not be used as the operand of a unary * operator that is evaluated. »
Donc, nan, ton i[2] = 0; ne va pas.
Pariel, pour les truc[-1], tout dépend comment tu as obtenu truc. Si c'est comme ça, pas de problèmes :
int *machin = malloc (42 * sizeof (int));
int *truc = machin + 1;
[^] # Re: Un milliard?!
Posté par Vivi . En réponse au journal 306 bugs dans FreeBSD. Évalué à 1.
Dans ton exemple, ça veut dire que l'on peut considérer i, i+1, et aussi i+2. Par contre la norme dit bien qu'on a pas le droit de déréférencer le i+2 « If the result points one past the last element of the array object, it shall not be used as the operand of a unary * operator that is evaluated. »
Donc, nan, ton i[2] = 0; ne va pas.
Pariel, pour les truc[-1], tout dépend comment tu as obtenu truc. Si c'est comme ça, pas de problèmes :
int *machin = malloc (42 * sizeof (int));
int *truc = machin + 1;