Speicherprobleme
-
Hallo Leute,
habe eine Frage, versteh ich bislang noch nicht
....
Und zwar schribe ich in einen char[4] eine Zeichenkette, leg zwei Zeichen in eine andere char[2] Kette ab. Trotzdem ist diese 4 Character lang warum.
Da versteht einer die Speicherwelt!!!Hier der Auszug aus dem Code:
[cpp]char minute[8]; char month[8]; char year[8]; char Stunde[8]; char date[2]; int i; char* Name; // char Name[20]; SYSTEMTIME systime; GetLocalTime(&systime); // year << systime.wYear; itoa(systime.wMinute,minute,10); itoa(systime.wHour,Stunde,10); itoa(systime.wMonth,month,10); itoa(systime.wYear,year,10); printf("%s %s %s %s\n", minute, Stunde, month, year); for(i=0;i<2;i++) date[i]=year[i+2];
-
Tentone schrieb:
...leg zwei Zeichen in eine andere char[2] Kette ab. Trotzdem ist diese 4 Character lang warum.
itoa hängt hinten eine 0 dran (string-ende) und bastelt bei negativen zahlen noch ein '-' vorne vor. mach die buffers einfach so gross, dass sie alle zeichen aufnehmen können, aus denen die längste int-zahl (als string in dem gewählten zahlensystem) bestehen kann.
-
Hallo,
danke mal für Deine Antwort. Wegen mir ist das so, aber nochmal eine Frage:
den Code habe ich so weiter geschrieben:
[cpp]for(i=0;i<2;i++) date[i]=year[i+2]; Name=date; // Name=year; strcat(Name,"."); strcat(Name,minute); //strcat(Name,Stunde); //cout << Name << endl; printf("%c %c\n", date[0], date[2]); printf("%s %s\n", date, Name);
Der Fehler ist klar. Ich überschreibe mit Name=date den Speicherinhalt. Aber wie umgehe ich das Problem?
Gruß
Tentone
-
Tentone schrieb:
... for(i=0;i<2;i++) date[i]=year[i+2]; ...
probiers mal so:
char date[3]; // <--- mindetens 3 zeichen, wenn du einen 2-zeichen langen string willst ... date[0] = year[2]; date[1] = year[3]; date[2] = 0; // <-- ende des strings ...
^^
-
Hallo nochmal,
eine letzte Frage noch. Weil das Thema ist noch nicht ganz verdaut, aber danke für eure Hilfe.
Immerhin funktioniert jetzt das Programm zu 80%. Bekomme bei der return Variablen noch kryptische Zeichenketten.
Sicherlich ist an mir kein C-Programmierer verloren gegangen... aber verbessern will man sich ja trotzdem.
Mit der Anweisung File=(char*) Name, lass ich ja File auf den Speicherinhalt von Name zeigen und ändere dadurch autmatisch auch diese Variable/diesen Speicherinhalt?
Wenn das so ist, wie kann ich das vermeiden /richtig machen? Und wie veranlasse ich mit dem return Befehlt, dass wirklich der Speicherinhalt zurückgegeben wird ohne kryptische ZEichen, die es "gar nicht gibt"?[cpp]
char* File; char* generate_file_name() { char minute[6]; char month[6]; char year[6]; char hour[6]; char day[6]; char date[6]; int i; char Name[80]; SYSTEMTIME systime; GetLocalTime(&systime); itoa(systime.wMinute,minute,10); itoa(systime.wHour,hour,10); itoa(systime.wMonth,month,10); itoa(systime.wYear,year,10); itoa(systime.wDay,day,10); for(i=0;i<2;i++) date[i]=year[i+2]; strcpy (Name,"TDC"); strcat (Name,"."); strcat(Name,"xxx"); strcat (Name,"."); strcat (Name,date); if (systime.wMonth<10) strcat(Name,"0"); strcat (Name,month); strcat (Name,day); strcat(Name,"."); strcat(Name,hour); strcat(Name,"h"); strcat(Name,minute); strcat(Name,"m"); strcat(Name,"."); strcat(Name,"bin"); File=(char*)Name; return File; }
-
Du gibst einen Zeiger auf eine lokale Variable zurück, das tut man nicht (undefiniertes Verhalten).
Das Array Name wird am Ende der Funktion zerstört, der Zeiger, den du zurückgibst, ist damit ungültig und für den Aufrufer unbrauchbar.Übergib der Funktion einen Zeiger auf einen Puffer, den der Aufrufer bereitstellen muss.
-
Hallo,
Danke!! Blöde Frage, wie realisiert man das
?
Gruß
Tentone
-
Tentone schrieb:
Hallo,
Danke!! Blöde Frage, wie realisiert man das?
so etwa:
void f (char *buffer) { strcpy (buffer, "hello buffer"); } void main (void) { char buffer[256]; f (buffer); puts (f); }
-
strdup gehört übrigens nicht zu den Ansi-C Standardfunktionen.
strdup ist ein netter Helfer in vielen Situationen, daher kommt diese Funktion mit den meisten Compilern, aber sie ist nicht allgemein genug für eine Standardfunktion.
Wobei die C-Standardbibliothek sowieso kein Beispiel für eine gute Standardbibliothek ist (aus heutiger Sicht zumindest).
Wenn du strdup in einem normalen Programm benutzt, dann ist das ok, aber bei einer Bibliothek sollte man versuch so wenig Annahmen wie möglich zu machen.