Hi Lexus
))
aufruf mit:
text = errorText(errorcode);
Ist ok !
Funktion:
char *errorText(int errorcode)
{
char text[] = „“;
strcpy(text,„BlaBla“);
return text;
}
Was ist daran falsch?
Das sind zwei wesentliche Fehler dirn:
(1) Mittels
char text[]= „“;
legst du auf dem Stack einen Speicherbereich von strlen(text)+1 Bytes an. Plus 1 deswegen, weil eine Zeichenkette ja mit einem Nullbyte abgeschlossen wird. In deinem Fall (leerer String) wird also 1 Byte reserviert und dieses wird mit einer Null initialisiert. Der C-Compiler interpretiert „text“ dann als Zeiger auf den Beginn dieses 1-Byte-Speicherbereichs. Mit
strcpy(text,„BlaBla“);
kopierst du jetzt den String „BlaBla“ in diesen Speicherbereich. Das erste ‚B‘ findet darin Platz, aber schon das erste ‚l‘ sprengt den reservierten Speicherplatz. Normalerweise wird das mit einem „segmentation fault“ oder (unter Windows) mit einer „ungültigen Seite“ geahndet!
(2) Mittels
char text[]= „“;
definierst du eine automatisches Array. Dieses wird angelegt, wenn du in den Funktionscode eintrittst und es wird zerstört, wenn du den Funktionscode verlässt. Mit anderen Worten, mit
return text;
überigbst du zwar die Startadresse deines Speicherbereichs, aber dieser ist ja beim Verlassen der Funktion errorText() zerstört worden. Der Zeiger „text“ zeigt außerhalb von errorText() also ins Nichts!
Eine korrekte Version von errorText() könnte z.B. so aussehen:
#include /\* Hier ist malloc() deklariert \*/
char \*errorText(int errorcode) {
char \*text= malloc(strlen("BlaBla")+1);
strcpy(text,"BlaBla");
return text; }
Hier wird mittels malloc() ein Speicherbereich von passender Länge definiert und seine Startadresse wird „text“ zugewiesen. Jetzt klappt auch der strcpy()-Aufruf. Und der Speicherbereich bleibt auch nach Verlassen von errorText() gültig. Ja du musst ihn außerhalb von errorText() sogar selber zerstören, etwa mit:
free(text);
Ich vermute jedoch, dass du einfach nur einen Text zu einer Fehlernummer zurückgeben möchtest. Das würde ich so programmieren:
char \*errorText(int nr) {
char \*meldungen[]= {
"Sie benutzen Windows, Fehler Nr. 0",
"Sie haben einen Pentium-Prozessor, Fehler Nr. 1",
"So geht's auch nicht, Fehler Nr. 2",
"User ist zu dumm, Fehler Nr. 3" };
return meldungen[nr]; }
Das funktioniert deswegen, weil alle konstanten Zeichenketten (also alle Fehlermeldungen) am Ende des Programms abgelegt werden und mit „char *meldungen[]“ ein Array von Zeigern auf char definiert wird, in dem die Startadressen dieser konstanten Zeichenketten abgelegt werden …
Du musst mal sehen, für welche Lösung du dich entscheidest. Ich hoffe, dir geholfen zu haben. Wenn du noch Fragen hast, kannst du dich gerne bei mir melden …
cu Stefan.