ich bin gerade dabei ein alttes C-Projekt aus VC6-Zeiten zu aktualisieren. Bearbeitet wird das Projekt nun in MS VC++ Express 2010. Es sind etliche Funktionen enthalten, welche den Typ LPSTR (char*) zurückgeben. Intern werden verschiedene Zeichenfolgen mit Hilfe von LPSTR-Parametern manipuliert und letztendlich mit lstrcpy zusammengefügt.
Eigentlich müsste die Funktion den Inhalt von s2 zurückgeben, welcher nach dem Kopieren in s1 steht. Macht sie aber nicht, es wird der Inhalt von s1 zurückgegeben! Und warum hat dieser Code bei der Übersetzung in VC6 schon mal funktioniert?
Der Augfruf von lstrcpy liefert schon nicht das gewünschte Ergebnis. Beim durchsteppen im Debugmodus wird im Rahmen dieses Aufrufes sogar eine "Schutzverletzung beim Schreiben..." ausgegeben, ohne dass es kracht. Deine Tips werde ich jetzt prüfen. Vielen Dank.
Du kannst einen String aus der Funktion MyFunction nicht so zurückgeben. Es sind dabei gleich mehrere Dinge bedenklich/falsch.
1. Kopiertst Du den String s2 an die Stelle von s1. Das geht nur daher gut, da s2 kürzer ist als s1. Für s1 wurde nur Platz für 16 Characters angelegt. Sollte s2 länger sein, dann kracht es bei lstrcpy. 2. Die Variablen s1 und s2 werden auf den Stack angelegt (lokale Variablen). Nach dem Verlassen der Funktion MyFunction ist der Speicher auf den die beiden Variablen weisen undefiniert. Eine solche Implementierung ist definitiv falsch. Sollte es unter gewissen Umständen funktioniert haben, so ist das reiner Zufall.
Du kannst die Methode folgendermaßen deklarieren:
LPSTR s1 = "sehr labger Text"; int len = strlen(s1); void MyFunction(LPSTR s1, int len) { LPSTR s2 = "kurzer Text"; // dann vielleicht noch eine Überprüfung ob s2 kürzer ist als s1 // und dann.. lstrcpy(s1,s2); }