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, zeigte p.
  • 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 oder 1ul 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.

InformationsquelleAutor wonbyte | 2010-12-07
Schreibe einen Kommentar