2013-05-14 12 views
5

§6.5.8\6 (riguardante>, <, < =,> =)strano formulazione standard, relativa confronto di puntatori

Se i punti espressione P ad un elemento di un oggetto matrice ei punti Q espressione fino all'ultimo elemento dello stesso oggetto matrice, l'espressione del puntatore Q2 + è maggiore di P. In tutti gli altri casi, , il comportamento non è definito.

Diverse sezioni sopra, §6.5.8, si spiega che fondamentalmente, l'aritmetica dei puntatori funziona come previsto sugli array. Questo è int a[3]; int *p = a; int *q = &a[2]; //q-p == 3 è valido. Tuttavia, come ho letto sopra q > p è UB.

Cosa mi manca? parte

+6

Ti manca la frase precedente alla precedente: "i puntatori agli elementi di matrice con valori di indice più grandi confrontano maggiore dei puntatori agli elementi della stessa matrice con indice inferiore".Quello che hai citato è un'eccezione per consentire intervalli semiaperti come ['a',' a + 3'). – dyp

+0

@DyP, oh, bene. Ho dovuto leggerlo altre 5 volte per capirlo. Un'altra domanda stupida forma il mio lato :( – Vorac

+1

È lo standard, alcune persone sostengono che è lo standard per formulazione difficile e non intuitiva;) – dyp

risposta

1

In primo luogo, è stato citato di un paragrafo, la prima parte spiega di cosa si fa riferimento, includo il paragrafo qui:

Quando due puntatori sono confrontati, il risultato dipende dalle posizioni relative a lo spazio indirizzo degli oggetti puntati. Se due puntatori ai tipi di oggetto puntano entrambi allo stesso oggetto , o entrambi puntano uno sull'ultimo elemento dello stesso oggetto matrice, essi sono uguali a confronto . Se gli oggetti puntati sono membri dello stesso oggetto aggregato, i puntatori per strutturare i membri dichiarati in seguito confrontano più dei puntatori ai membri dichiarati in precedenza nella struttura e i puntatori agli elementi di matrice con indice maggiore confrontano valori maggiori di puntatori agli elementi di lo stesso array con valori di indice inferiori. Tutti i puntatori ai membri dello stesso oggetto unione sono uguali. Se l'espressione P punta a un elemento di un oggetto matrice e l'espressione Q punta all'ultimo elemento dello stesso oggetto matrice, l'espressione del puntatore Q + 1 è maggiore di P. In tutti gli altri casi, il comportamento non è definito.

Fondamentalmente, il bit eri fa riferimento si riferisce al fatto che normalmente un puntatore deve sempre punto situato ad un solo oggetto basamento, ad un elemento di un array di oggetti o uno oltre la fine di un array di oggetti. Come puoi vedere, normalmente l'incremento di un puntatore che punta già sull'ultimo elemento di un array produce un puntatore non valido, e infatti questo puntatore nello standard non deve mai essere dereferenziato, tuttavia può essere usato per un caso speciale che è quello può essere impostato o confrontato con un altro puntatore.

Questo è utile in un programma in cui si incrementa un puntatore, quindi si controlla se è oltre la fine dell'array e termina se lo fa. Per esempio.

int foo = 0; 
int ArrSize = 6; 
int bar[ArrSize]; 
while(foo < ArrSize) 
{ 
    foo++; 
    printf("%d", bar + 3 < bar + foo); 
} 

sarà legale, anche in quest'ultimo caso in cui sottolinea uno oltre la fine della matrice foo.

Nota questo esempio è molto elaborato ma dimostra il punto.

Se non fosse per questa regola, questo programma sarebbe un comportamento indefinito.

+0

L'ultima iterazione causa un comportamento non definito nel codice di esempio. 'bar + 7' causa UB sotto la sezione su cosa significa' + 'per puntatore più intero. –

+0

@MattMcNabb Argh, hai ragione, ho usato l'operatore sbagliato, avevo intenzione di usare un <. Ho letteralmente mescolato queste due centinaia di volte, avrei pensato dopo quasi 15 anni di C avrei evitato quell'errore stupido. Comunque, grazie per il commento, penso che sia stato risolto ora. – Vality

+1

@MattMcNabb Mi sono reso conto che non c'è eccezione per Q + 2, l'errore che ho fatto, e sempre per quello che riguarda è la lunghezza dell'array! = L'indice dell'ultimo elemento. Conto sempre da 1 e non zero :( – Vality