std :: ptrdiff_t ist signiert. std :: size_t ist nicht signiert. Das Umwandeln von strlen(p)
in ptrdiff_t
würde Sinn ergeben, wenn p
eine negative Länge haben könnte, was nicht möglich ist.
Dieser Cast kann jedoch den resultierenden vorzeichenbehafteten Wert überschreiten, wenn p
groß genug ist (z. B. größer als 2.147.483.647 Bytes auf den meisten 32-Bit-Plattformen). So könnte es einen Fehler in Ihrer Zeigerarithmetik einführen.
Am besten kleben Sie hier mit size_t
.
Sie müssen nicht nach ptrdiff_t
umwandeln. Zeigerarithmetik ist für alle Integraltypen gut definiert, einschließlich size_t
, und wenn size_t
nicht groß genug ist, um den Wert zu speichern, kommt die Umwandlung in ptrdiff_t
sowieso zu spät.
Hier ist die relevante Sprache aus dem Standard (C ++ 0x FCD, Abschnitt [expr.add]
):
Wenn ein Ausdruck ein Integral hat Typ wird zu a hinzugefügt oder von ihm subtrahiert Zeiger hat das Ergebnis den Typ von der Zeigeroperand. Wenn der Zeiger Operand zeigt auf ein Element von einem Array-Objekt, und das Array ist groß genug, das Ergebnis zeigt auf ein Element-Offset vom Original so dass der Unterschied von die Indices der resultierenden und Original-Array-Elemente entsprechen dem Integraler Ausdruck. Mit anderen Worten, wenn der Ausdruck P auf das i zeigt Element eines Array-Objekts, die Ausdrücke (P) + N (äquivalent, N + (P)) und (P) -N (wobei N die Wert n) zeigen jeweils auf die i + n-te und i - n-te Elemente von das Array-Objekt, sofern sie vorhanden sind. Außerdem, wenn der Ausdruck P zeigt bis zum letzten Element eines Arrays Objekt, der Ausdruck (P) +1 Punkte eins nach dem letzten Element des Arrays Objekt, und wenn der Ausdruck Q zeigt eine nach dem letzten Element eines Arrays Objekt, der Ausdruck (Q) -1 zeigt auf das letzte Element des Array-Objekts. Wenn sowohl der Zeigeroperand als auch der Ergebnispunkt auf Elemente derselben Array-Objekt oder eines nach dem letzten Element des Array-Objekts, das Bewertung darf kein Überlauf; Ansonsten ist das Verhalten undefiniert.
Tags und Links c++