Secondo N1570 (C11 bozza) 6.5.6/8
Operatori additivi:Qual è la logica per uno dopo l'ultimo elemento di un oggetto array?
Inoltre, se l'espressione
P
punti per l'ultimo elemento di un oggetto array , l'espressione(P)+1
punti uno dopo l'ultimo elemento della oggetto matrice, e se l'espressioneQ
punti uno dopo l'ultimo elemento di un oggetto array, l'espressione(Q)-1
punti per l'ultimo elemento dell'oggetto matrice
sottoparagrafo 6.5.6/9
contiene inoltre:
Inoltre, se l'espressione
P
punti sia ad un elemento di un oggetto array o uno dopo l'ultimo elemento di un oggetto array, e l'espressioneQ
indica l'ultimo elemento dello stesso oggetto matrice, l'espressione((Q)+1)-(P)
delloha lo stesso valore di((Q)-(P))+1
e come-((P)-((Q)+1))
e ha il valore zero se l'espressioneP
punta a uno dell'ultimo elemento di l'oggetto matrice, anche se l'espressione(Q)+1
non punta a un elemento dell'oggetto matrice. 106)
Questo giustifica aritmetica puntatore simili sia valida:
#include <stdio.h>
int main(void)
{
int a[3] = {0, 1, 2};
int *P, *Q;
P = a + 3; // one past the last element
Q = a + 2; // last element
printf("%td\n", ((Q)+1)-(P));
printf("%td\n", ((Q)-(P))+1);
printf("%td\n", -((P)-((Q)+1)));
return 0;
}
ci si aspetterebbe di non consentire indicando elemento dell'array fuori dal campo, per cui dereferenziare agisce comportamento indefinito (superamento della matrice), quindi lo rende potenzialmente pericoloso. C'è qualche logica per questo?
"Mi aspetterei di non consentire il puntamento all'elemento di matrice fuori limite, per il quale la dereferenza agisce come comportamento non definito". Il dereferenziamento di questo elemento non è consentito quindi non c'è alcun problema. "C'è qualche logica per questo?" Sì, troppi da elencare. Google per * intervalli semiaperti in C *. –
C (normalmente) non esegue il controllo dei limiti, quindi il codice verrà compilato correttamente. Tuttavia, l'accesso alla memoria al di fuori dei limiti dell'elemento a cui si accede è un comportamento indefinito e può/porterà ad un evento di errore del segmento. – user3629249