Heap-Probleme bei strcat
-
Hallo liebe Community...
ich habe ein Fehler in einem meiner Programmabschnitte.
Ich versuche folgendes zu erreichen: Zur Laufzeit des Programms gibt eine Funktion einen char[4] zurück und eine andere Funktion ein char[x], wobei die Länge variiert. Diese chars sollen verketten werden und zusammen an eine Funktion übergeben werden...das hab ich bisher wie folgt gelöst:
char * buffer = new char[strlen(GetCards()) + 4 + 1]; strcat(buffer, GetCards()); strcat(buffer, "XxXx");Übergabe von buffer an Funktion
Nach einigen Aufrufen der Funktion erhalte ich jedoch ein HeapError und irgendwann den Fehler, dass zu wenig Speicher vorhanden ist. In dem obigen Beispiel ist die länge aber immer statis, d.h. 4 + 4 + 1.
Als Workaround habe ich mit Strings gearbeitet:
std::string buffer = ""; buffer += GetCards(); buffer += "XxXx";> Übergabe von buffer.c_str() an Funktion.
Der Workaround funktioniert, erklärt mir aber nicht wieso die in meinem Sinne sauberere Variante fehler bringt. Genügend Speicher allokiere ich doch vorher?
Könnt ihr mir helfen? Danke!
-
milchbart schrieb:
char * buffer = new char[strlen(GetCards()) + 4 + 1]; strcat(buffer, GetCards());Hier ist das Problem: strcat hängt an einen nullterminierten String an. Der Speicher, den dir new[] liefert, ist aber nicht initialisiert, also insbesondere auch nicht nullterminiert.
Und std::string sollte die Standardlösung sein, kein Workaround, wenn das Array-Gefrickel einmal nicht funktioniert.
-
milchbart schrieb:
char * buffer = new char[strlen(GetCards()) + 4 + 1]; strcat(buffer, GetCards()); strcat(buffer, "XxXx");Die übliche Verfahrensweise hierfür ist, zuerst 1x strcpy (statt strcat) zu verwenden.
-
Der Workaround [über std::string] funktioniert, erklärt mir aber nicht wieso die in meinem Sinne sauberere Variante fehler bringt.
Ich finde, du hast ein komisches Verständnis von Sauberkeit.
-
EDIT: ach egal,
stringist sowieso die einzige Wahl hier