Hallo Alex,
Ist ein typischer Anfängerfehler
was mach ich falsch … ich denke mal ich mache irgendeinen
Fehler mit den Zeigern?
JAIN.
Also.
Wenn cstring() aufgerufen wird, wird als erstes der Wert von „* source“ auf dem Stack abgelegt, dann die Rücksprungadresse und nach cstring() verzweigt.
Der Code von cstring() sichert dann mal die benötigten CPU-Register auf dem Stack und schaft auf dem Stack auch den nötigen Speicherplatz für „target[255]“.
„return *target;“ bewirkt nun, dass die Speicheradresse von target in das Rückgabe-register übertragen wird. Danach werden die geretteten Register wieder vom Stack genommen und der STack wieder in den Zustand versetzt wie er beim Aufruf von cstring() war …
HALT !!!
„target[255]“ war doch auf dem Stack ???
Du gibst also einen Zeiger zurück, welcher auf einen Speicherbereich zeigt, welcher nun wieder zur weiteren Verwendung freigegeben wurde !!!
Wenn du also nach dem Rücksprung mit dem Zeiger zugreiffst, kann da alles mögliche stehen, nur nicht mehr diejenigen Zeichen, welche du mal dahin kopiert hast.
Abhilfe wäre „char target[255];“
als
" static char target[255];" zu deklarieren, dann wird der Speicher nicht auf dem Stack reserviert, sondern im normalen Variablen-Bereich.
Allerdings hat das, den Nachteil, dass bei zwei aufeinanderfolgenden Aufrufen von cstring() jedesmal der Inhalt von „target“ verändert wird.
Ein weiteres Problem deiner Funktion ist noch, dass dein Programm aufs übelste Abstürzen kann, wenn strlen(source) grösser als 255 ist. Das ist dann so ein Bug, den man manchmal lange suchen kann !!!Besonders weil er nicht unbedingt reproduzierbar ist, weil es nur dann knallt, wenn zum richtigen Zeitpunkt ein Interrupt im System auftritt.
Pracktisch sollte man cstring() anders schreiben:
char cstring(char*target, char* source, int maxlen);
die Zeile:
char target[255]; //zielvariable,die ich zurückgeben will
entfällt dann !!
Mit „maxlen“, kannst du dann sicherstellen, dass du keine Bufferoverruns erzeugst.
MfG Peter(TOO)
> char cstring(char\* source)
> {
> char target[255]; //zielvariable,die ich zurückgeben will
> for (int pos=0;pos