Int to *char mit sprintf
-
Hallo,
leider muss ich euch schon wieder mit einem meiner Probleme nerven...
Ich habe einen int-Wert der in einen String gewandelt werden soll. Da dies an mehreren Stellen passiert, will ich das in eine Funktion packen. In der FAQ und auf diversen Webseiten gibts nun den Weg mit itoa() oder sprintf(), beide verursachen bei mir einen Segmentation-Fault. Leider finde ich meinen Fehler nicht.char* idtostr(int dataid){ char *ids; sprintf(ids,"%d",dataid); return ids; }
Liefert nun oben besagten Fehler, während
char* idtostr(int dataid){ char *ids="Test\n"; return ids; }
einwandfrei funktioniert. Wo ist mein Fehler?
Achso, ja, mir ist bewusst, dass die Rückgabe eines Arrays ohne Kapselung in struct C++ ist, aber an der Stele vermute ich nicht das Problem, und das restliche Programm ist auch Ansi CVerwendeter Compiler ist (leider) Visual Studio 6.
Gruß, Simon
-
char *ids; sprintf(ids,"%d",dataid);
ids zeigt irgendwo hin. irgendwo in den speicher rein. der gehoert dir aber mit grosser wahrscheinlichkeit nicht.
du musst speicher fuer ids reservieren.
lies mal in deinem lieblings buch/tutorial etwas ueber zeig und dynamische speicher allokierung (malloc/free) nach.
-
Ok, peinlich, das sollte ich allmählich nicht mehr übersehen. Ich plage mich jetzt schon etwas länger damit rum, dabei wird man wohl etwas betriebsblind.
In der Ursprungsversion stand hier auch (hoffentlich richtig): char ids[32]
weil aber der Rückgabewert der Funktion nur Mist enthielt, habe ich alles (un-)mögliche probiert.
-
Auch bei char ids[32] wird Mist zurückgeben, da das Array nach Funktionsende wieder gelöscht ist. Du könntest "static char ids[32]" verwenden.
-
Ok, an dieser Stelle habe ich wirklich mal wieder was dazugelernt.
Vielen Dank für diesen Tipp!
-
Shade Of Mine schrieb:
char *ids; sprintf(ids,"%d",dataid);
ids zeigt irgendwo hin. irgendwo in den speicher rein. der gehoert dir aber mit grosser wahrscheinlichkeit nicht.
du musst speicher fuer ids reservieren.
nicht nur das ist das Problem. Beim Verlassen der Funktion 'idtostr' ist der Gültigkeitsbereich von 'ids' verloren, also noch ein seg fault.
@Simon:
Wenn du keinen Speicher dynamisch anlegen willst, kannst du auch eine statische variable definieren. Auf keinen Fall nur ein Array, denn der zeigt ins Nirvanachar* idtostr(int dataid){ static char ids[12]; /* ein int auf x68 wird nicht mehr als 10 Ziffern haben */ sprintf(ids,"%d",dataid); return ids; }
oder
void foo() { char sid[12]; ... idtostr(dataid, sid); } char* idtostr(int dataid, char* buffer) { sprintf(buffer,"%d",dataid); return buffer; }