2013-04-26 8 views
8

In base a questo topic, il confronto del puntatore con un ultimo elemento di un array con l'oggetto è consentito.">" con uno prima del primo elemento di un oggetto array

E secondo @jalf commento, confrontando puntatore con una prima del primo elemento di un oggetto array è vietato.

example1

int array[10]; 
int *ptr; 
for(ptr=&array[9]; ptr>(array-1); ptr--) {...} 

example2

int array[10]; 
int *ptr; 
for(ptr=&array[9]; ptr>=(array); ptr--) {...} 

1) Sono entrambi example1 e esempio2 proibito?

2) Esiste la prova dello standard C che confronta il puntatore con uno prima che il primo elemento di un oggetto dell'array sia vietato?

+2

Per quanto riguarda il motivo: lo speciale consente di rappresentare tutte le sezioni di elementi (all'interno di un array) utilizzando 2 puntatori. Se dovessi puntare al primo e all'ultimo elemento della sezione, non potresti rappresentare una sezione vuota; ma avendo un intervallo semiaperto come una rappresentazione, puoi: '[p, p)' rappresenta una sezione vuota. –

risposta

13
  1. Sì, entrambi sono comportamenti non definiti: nel primo caso, array-1 non è definito; nel secondo caso, ptr diventa indefinito quando viene decrementato dopo l'iterazione quando è uguale a array.
  2. Questo è coperto dalla sezione 6.5.6 della norma, parte 8 (enfasi è mio):

Quando viene aggiunto o sottratto da un puntatore un'espressione che ha tipo intero, il risultato ha il tipo dell'operando del puntatore. Se l'operando puntatore punta a un elemento di un oggetto array e la matrice è sufficientemente grande, il risultato punta a un elemento di offset rispetto all'elemento originale in modo tale che la differenza tra gli indici degli elementi di matrice risultante e originale sia uguale all'espressione intera. In altre parole, se l'espressione P punta all'elemento i-esimo di un oggetto array, le espressioni (P)+N (equivalentemente, N+(P)) e (P)-N (dove N ha il valore n) indicano, rispettivamente, il i+n -esimo e i−n - th elementi dell'oggetto array, a condizione che esistano. Inoltre, se l'espressione P punta all'ultimo elemento di un oggetto matrice, l'espressione (P)+1 punta a uno oltre l'ultimo elemento dell'oggetto matrice e se l'espressione Q punta oltre l'ultimo elemento di un oggetto matrice, l'espressione (Q)-1 punti fino all'ultimo elemento dell'array. Se sia l'operando del puntatore che il risultato puntano a elementi dello stesso oggetto matrice o uno dopo l'ultimo elemento dell'oggetto matrice, la valutazione non deve produrre un overflow; in caso contrario, il comportamento non è definito. Se il risultato punta oltre l'ultimo elemento dell'oggetto array, non deve essere utilizzato come operando di un operatore unario * che viene valutato.

Lo standard va lunghezza per coprire l'elemento nella posizione uno dopo l'ultimo elemento dell'oggetto matrice, mentre l'elemento nella posizione prima del primo elemento rientra nella clausola "altrimenti" della regola precedente.

+0

Grazie per la risposta. quindi è lo stesso paragrafo dell'altro argomento. Non sono guarito la prima volta. Grazie per la spiegazione – MOHAMED

Problemi correlati