Die Länge eines nicht initialisierten Strings ist nicht definiert.
Du erzeugst einen String, in dem irgendetwas drin steht. strlen() wird jedoch bis zur ersten 0 wandern und die Bytes bis dahin zählen.
Edit:
Oh, und was die 24 angeht: Diese 24 ist keine 24. Im Speicher hast du eine Binärrepräsentation, deine 24 hingegen ist dezimal. Also 2410 ist nicht dasselbe wie eine 24 und eine 10.
Davon abgesehen:
1. char* gehört nicht in C++-Programm. Benutze std::string. Dasselbe gilt für Funktionen wie ltoa oder strlen.
2. In einer Funktion Speicher zu reservieren und den Zeiger darauf zurückzugeben ist schon ein wenig böse. Eher solltest du (C-Style) den Puffer als Ausgabeparameter anlegen oder (C++-Style) entweder std::string oder eine eigene Klasse verwenden.
3. Du gibst den Speicher, den du in der Schleife reservierst, niemals frei.
4. Zwei Variablen im for-Kopf zu verwenden ist zwar möglich, aber schlechter Stil. Die Lektüre von ein wenig Scott Adams oder auch des guten alten C++-FAQ Lite sollte hier Abhilfe schaffen, oder Code Complete von Steve McConnell.