Ich verzweifele am Pointer
-
Ich verzweifele so langsam an eingentlich einer einfachen Funktion.
Ich habe eine Funktion GetTime die mir die Uhrzeit zurückliefern soll. Sie tut es aber nicht.
Ich habe mich jetzt schon stunden mit Pointer beschäftigt aber ich raffe einfach nicht wo der Fehler liegt.
Hier mal mein Code:
void GetTime(char **p_time) { char timestr[21]; struct timeb tm; ftime(&tm); strftime((char*) ×tr, 20, "%H:%M", localtime(&tm.time) ); *p_time = timestr; } int main(int argc, char **argv) { char *a; GetTime(&a); printf("a = %s \n",a); return 0; }
Wenn ich das Programm starte bekomme ich als ergebniss:
a = 0
Füge ich in GetTime printf("timestr = %s/n",timestr);
ein wird die Uhrzeit korrekt angezeigt.gruß tagra
-
Klassischer Fehler: Das Array char timestr[...] existiert nur lokal in der Funktion GetTime. Du kannst da keinen Zeiger drauf richten, weil nach dem Ablauf der Funktion GetTime der Speicherbereich ganz anders genutzt werden kann.
Lsöungsideen:
- Den Speicher auf dem Stack in der aufrufenden Funktion bereitstellen.
- Dynamische Speicherverwaltung.
- Die Struktur timeb zurückliefern.
...
-
Das erste Problem ist z.B. das du versuchst, dein innerhalb der Funktion GetTime angelegtes Array timestr zurück zu geben. Das geht nicht.
Eine funktionierende Möglichkeit wäre z.B. mit malloc Speicher anzulegen und deinen String dann dort rein zu kopieren, z.B. mit memcpy
-
Ausserdem sollte der Protoyp so aussehen:
void GetTime(char * p_time);
dann reicht auch die Zuweisung
p_time = timestr;
Auf welchem System benutzt du ftime()?
Zeh Mau
-
Das Programm läuft auf ner dbox2 mit linux druf.
gruß tagra
-
tagra schrieb:
Das Programm läuft auf ner dbox2 mit linux druf.
Danile E. schrieb:
... weil nach dem Ablauf der Funktion GetTime der Speicherbereich ganz anders genutzt werden kann.
jo dann hast du glück gehabt, aber das ist reiner zufall - der speicher hätte hier währendher genausogut für was anderes verwendet werden können und so das gleiche problem wie anfangs genannt verursachen. man sollte sich auf gar keinen fall auf sowas verlassen nur weils mal hinhaut!
-
Kann mir da mal jemand ein Beispiel posten ?
Danke
-
Ok Danke jetzt hab ich es geschafft.
void GetTime(char **p_time) { char *s_time=NULL; char timestr[21]; struct timeb tm; ftime(&tm); strftime((char*) ×tr, 20, "%H:%M", localtime(&tm.time) ); s_time =(char *) malloc(5); memcpy(s_time,timestr,5); *p_time = s_time; } int main(int argc, char **argv) { char* a = NULL; GetTime(&a); printf("a = %s \n",a); return 0; }