2013-04-30 12 views
17

c99/c++03 garantisce che &a+1 > &a è sempre vero?"& a + 1> & a" causa un comportamento non definito

per esempio, c'è una (c-like) std::copy, e

int a = 0 ; 
int b[9] ; 
std__copy(&a , &a+1 , b) ; 

fa questo lavoro da sempre?

+0

può essere lo stesso di http://stackoverflow.com/questions/16233868/pointer-comparisons-with-one-past-the-last-element-of-an-array-object – MOHAMED

+0

Sì, anche se la risposta @ MOHAMED è un riferimento per parlare di un array, è lo stesso principio per un oggetto semplice. –

+1

@ MOHAMED, no non è lo stesso. Non c'è dubbio per il caso di un array, ma per una variabile non array deve esserci un testo speciale. – AProgrammer

risposta

17

Sì, C99 ha particolare formulazione a dire che quando si lavora con indirizzi, un dato oggetto a agirà come un array di 1 articolo, in modo che &a+1 è valido (§6.5.6/7):

Per gli scopi di questi operatori, un puntatore a un oggetto che non è un elemento di un array si comporta come un puntatore al primo elemento di un array di lunghezza uno con il tipo dell'oggetto come tipo di elemento.

Sebbene il numero di sezione sia diverso (§6.3.6), C90 fornisce lo stesso requisito.

C++ ha lo stesso requisito in §5.7/4 (stesso numero di sezione in C++ 03 e C++ 11).

In C++, è possibile confrontare gli indirizzi di oggetti arbitrari (dello stesso tipo) utilizzando std::less, anche se l'operatore < integrato non produce risultati significativi (ad esempio, due oggetti che non fanno parte della stessa matrice) (§20.8.5/7):

per modelli greater, less, greater_equal e less_equal, specializzazioni per qualsiasi tipo puntatore cedere un ordine totale, anche se gli operatori predefiniti <,>, < =, > = non farlo.

Si noti inoltre che anche se è possibile formare questi indirizzi, e possibile confrontare l'indirizzo di un oggetto, si non può dereference questi puntatori (beh, il compilatore probabilmente non si fermerà se si prova, ma il risultato sarà un comportamento indefinito).

+0

Interessante, non ho mai saputo che 'std :: less' ha funzionato per confrontare gli indirizzi arbitrari. Come esattamente lo standard lo garantisce? – chris

+0

@chris: vedere la risposta modificata. –

+0

Vedo, grazie :) – chris

3

Sì, ciò è garantito in C++ (non so su C). Lo specifico è che una variabile di tipo T è equivalente a un array di un singolo elemento dello stesso tipo e si può sempre ottenere un puntatore oltre la fine di un array.

+0

se ha lo stesso prinicipe dell'oggetto array devi menzionare nella risposta quel parametro di deferencing del puntatore '& a + 1' è vietato – MOHAMED

+0

@MOHAMED: beh, l'OP non lo dereferenzia, quindi non è molto rilevante per la risposta :) – jalf

+0

So solo di fargli più attenzione quando si usa un comportamento del genere :-) – MOHAMED

Problemi correlati