C++ ptrdiff_t size_t oder
Wenn Sie den folgenden code, wo p ist eine Zeiger:
p = p + strlen(p) + size_t(1);
Seit strlen()
und size_t
sind beide size_t
sollte, und ich warf Sie den code ptrdiff_t
?
p = p + (ptrdiff_t)(strlen(p) + size_t(1));
Wenn ja, warum?
Dank,
Greg
- was Sie versuchen zu tun, ist ungültig, C++, weil die
p + (ptrdiff_t)(strlen(p) + size_t(1))
- Adresse aus dem array von char ist, zeigtep
. - nicht unbedingt. das p-array muss nicht am ENDE die null.
- Jansen: Sie können nicht wissen, dass im Allgemeinen - es hängt davon ab, wie der Speicher für
p
zugeteilt wurde. Es gibt nichts in C, die aufhören würde einen string, der kürzer (!) als die Speicher-block-hosting-it. - Alex, FrankH: In jedem Fall ist es gut definiert und die normale zu konstruieren, die einen Zeiger auf die memory location ein-past-the-end. Das ist es, was
std::vector::end()
hat zum Beispiel. Kann man nicht dereferenzieren, die Zeiger, aber es IST ausdrücklich gilt für alle anderen Zeiger-Operationen. Relevante Zitat aus dem standard: <Zitat>es sei denn, beide Zeiger zeigen auf die Elemente des array-Objekt, oder die eine hinter dem letzten element des array-Objekts, ist das Verhalten undefiniert.</Zitat> - Es sollte auch darauf hingewiesen werden, dass Sie wirklich nicht brauchen, size_t, der hier gewirkt. Der compiler wird wahrscheinlich beschweren sich über "signed/unsigned mismatch", in welchem Fall die richtige Lösung ist, schreiben
1u
oder1ul
statt der cast. - Wenn ich hatte, dass C++ - code, ich würde sofort umgestalten Verwendung einer string-Klasse.
- wow, sind Sie eine schnelle schreibkraft. Instant ist ziemlich gut, für jeden umgestalten.
- Ich tun, biegen Sie die Gesetze der Physik von Zeit zu Zeit. Ich meinte sofort entscheiden, umgestalten, nicht sofort umgestalten wahrsten Sinne des Wortes.
- sorry, nur ein Scherz. "Würde ich überarbeiten, sobald ich hatte einen Kaffee", vielleicht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
std::ptrdiff_t unterzeichnet ist. std::size_t nicht signiert ist. Casting
strlen(p)
zuptrdiff_t
würde Sinn machen, wennp
haben könnte, eine negative Länge, was nicht möglich ist.Jedoch, dass cast überlaufen konnten den resultierenden Wert mit Vorzeichen, wenn
p
groß genug ist (zum Beispiel größer als 2.147.483.647 bytes auf den meisten 32-bit-Plattformen). So könnte es vorstellen, ein Fehler in der Zeiger-Arithmetik.Besten zu bleiben, mit
size_t
hier.PTRDIFF_MAX
gleich9223372036854775807
die aussieht genug.Es gibt keine Notwendigkeit zu werfen, um
ptrdiff_t
. Zeiger-Arithmetik ist gut definiert für alle integralen Typen, einschließlichsize_t
, und wennsize_t
war nicht groß genug, um halten Sie den Wert, den cast zuptrdiff_t
kommt eh zu spät.Hier ist der entsprechende Sprache aus der Standard (C++0x-FCD, Abschnitt
[expr.add]
):