Zeiger Vergleiche "" mit einem vor dem ersten Element eines Array-Objekts

8

Nach diesem topic , Vergleichen des Zeigers mit eins nach dem letzten Element eines Array -Objekts ist zulässig.

Und nach dem @jalf -Kommentar ist das Vergleichen des Zeigers mit eins vor dem ersten Element eines Array-Objekts verboten.

Beispiel1

%Vor%

Beispiel2

%Vor%

1) Sind sowohl example1 als auch example2 verboten?

2) Gibt es einen Beweis aus dem C-Standard, dass das Vergleichen des Zeigers mit eins vor dem ersten Element eines Array-Objekts verboten ist?

    
MOHAMED 26.04.2013, 10:48
quelle

1 Antwort

13
  1. Ja, beide sind undefiniertes Verhalten: Im ersten Fall ist array-1 nicht definiert; Im zweiten Fall wird ptr undefiniert, wenn es nach der Iteration dekrementiert wird, wenn es gleich array ist.
  2. Dies wird in Abschnitt 6.5.6 des Standards, Teil 8 (Schwerpunkt ist meins) behandelt:
  

Wenn ein Ausdruck, der einen Integer-Typ hat, zu einem Zeiger addiert oder von ihm subtrahiert wird, hat das Ergebnis den Typ des Zeigeroperanden. Wenn der Zeigeroperand auf ein Element eines Array-Objekts zeigt und das Array groß genug ist, zeigt das Ergebnis auf ein Element, das vom ursprünglichen Element versetzt ist, so dass die Differenz der Indizes der resultierenden und ursprünglichen Arrayelemente gleich dem ganzzahligen Ausdruck ist. Mit anderen Worten, wenn der Ausdruck P auf das i-te Element eines Array-Objekts zeigt, die Ausdrücke (P)+N (äquivalent, N+(P) ) und (P)-N (wobei N den Wert n hat) zeigen Sie auf die Elemente i+n -th und i−n -th des Array-Objekts, sofern diese vorhanden sind. Wenn der Ausdruck P auf das letzte Element eines Array-Objekts zeigt, verweist der Ausdruck (P)+1 außerdem auf eins nach dem letzten Element des Array-Objekts, und wenn der Ausdruck Q auf eins nach dem letzten Element eines Arrays zeigt Objekt, zeigt der Ausdruck (Q)-1 auf das letzte Element des Array-Objekts. Wenn sowohl der Zeigeroperand als auch das Ergebnis auf Elemente desselben Arrayobjekts oder eines nach dem letzten Element des Arrayobjekts zeigen, darf die Auswertung keinen Überlauf erzeugen. Andernfalls ist das Verhalten nicht definiert. Wenn das Ergebnis hinter das letzte Element des Array-Objekts zeigt, darf es nicht als Operand eines unären * -Operators verwendet werden, der ausgewertet wird.

Der Standard ist so lang, dass er das Element an der Position hinter dem letzten Element des Array-Objekts abdeckt, während das Element an der Position eins vor dem ersten Element unter den "sonst" -Klausel der obigen Regel fällt.

    
dasblinkenlight 26.04.2013, 10:58
quelle

Tags und Links