Zeigervergleiche "" mit einem nach dem letzten Element eines Array-Objekts

8

Ich weiß, dass die Zeigervergleiche mit < im C-Standard nur zulässig sind, wenn die Zeiger auf den gleichen Speicherplatz zeigen (wie das Array).

wenn wir ein Array nehmen:

%Vor%

vergleicht ptr mit array+10 erlaubt? Wird der array+10 -Zeiger außerhalb des Array-Speichers betrachtet und ist der Vergleich nicht erlaubt?

Beispiel

%Vor%     
MOHAMED 26.04.2013, 10:07
quelle

2 Antworten

8

Ja, ein Zeiger darf auf den Ort direkt hinter dem Ende des Arrays zeigen. Sie dürfen jedoch einen solchen Zeiger nicht ablehnen.

  

C99 6.5.6 / 8 Additive Operatoren (Hervorhebung hinzugefügt)

     

wenn der Ausdruck P auf das letzte Element eines Array-Objekts zeigt,   Ausdruck (P) +1 zeigt eins nach dem letzten Element des Array-Objekts,   und wenn der Ausdruck Q hinter das letzte Element eines Arrays zeigt   Objekt, der Ausdruck (Q) -1 zeigt auf das letzte Element des Arrays   Objekt. Wenn sowohl der Zeigeroperand als auch das Ergebnis auf Elemente zeigen   des gleichen Array-Objekts, oder nach dem letzten Element des Arrays   Objekt darf die Bewertung keinen Überlauf erzeugen; ansonsten der   Verhalten ist nicht definiert. Wenn das Ergebnis nach dem letzten Element liegt   des Array-Objekts soll es nicht als Operand eines Unary verwendet werden   Operator, der ausgewertet wird.

Und speziell für Vergleichsoperationen auf Zeigern:

  

C99 6.5.8 / 5 Relationale Operatoren

     

Wenn der Ausdruck P auf ein Element eines Array-Objekts zeigt und der   Ausdruck Q zeigt auf das letzte Element desselben Array-Objekts, das   Zeigerausdruck Q + 1 vergleicht größer als P. In allen anderen Fällen   Das Verhalten ist nicht definiert.

    
Michael Burr 26.04.2013, 10:12
quelle
4

Ja, das ist erlaubt, und C ++ stützt sich stark darauf (C benutzt es nicht so sehr, aber in C ++ ist eine sehr gebräuchliche Art, Bereiche zu bezeichnen, ein Zeiger (oder allgemeiner ein Iterator) Zeigen Sie auf das erste Element, und zeigen Sie ein anderes hinter an das Ende des Bereichs.

Es ist zulässig, dass ein solcher Zeiger existiert und dass er mit dem Rest des Arrays verglichen wird.

Aber es ist nicht legal, den Zeiger jemals zu dereferenzieren.

    
jalf 26.04.2013 10:14
quelle

Tags und Links