Forum: Compiler & IDEs Anfängerproblem mit Funktion, die Zeiger auf char[] zurückgibt


von sam (Gast)


Lesenswert?

Hallo zusammen,

ich stehe gerade etwas auf dem Schlauch.
Ich habe mal ein einfaches Beispiel für eine Funktion die auf ein char 
Array per Zeiger verweist und dann per LCD Display ausgegeben wird. Auf 
die Funktion lcd_string... gehe ich hier nicht näher ein.
Was spreche ich bei dem Zeiger falsch an?

Danke für eure Hilfe!
Sam


C-Code:
1
int * zeigerfunktion(void) {
2
   char Buffer[20];
3
   sprintf(Buffer,"Teststring");
4
   return Buffer;
5
}
6
7
8
9
int main(void) {
10
   char Buffer[20];
11
   int *p;
12
   p = zeigerfunktion();
13
   lcd_string( &p ); // funktioniert nicht, keine Anzeige!
14
   
15
   sprintf(Buffer,"Teststring");
16
   lcd_string( Buffer ); // funktioniert!
17
   
18
   
19
}

: Bearbeitet durch User
von Dr. Sommer (Gast)


Lesenswert?

sam schrieb:
> int * zeigerfunktion(void) {
>    char Buffer[20];
>    sprintf(Buffer,"Teststring");
>    return Buffer;
> }
Die Variable "Buffer" ist temporär. Sobald die Funktion zurückkehrt, 
wird sie gelöscht. Der zurückgegebene Zeiger zeigt also ins Nichts. 
Außerdem, warum gibst du einen Zeiger auf "int" zurück, während Buffer 
ein Array aus "char" ist?

Typischerweise löst man das, indem man den Buffer in der main() anlegt 
und einen Zeiger darauf an die zeigerfunktion() übergibt, die den dann 
nur noch füllt und nichts zurückgibt.

von dfgh (Gast)


Lesenswert?

sam schrieb:
> lcd_string( &p ); // funktioniert nicht, keine Anzeige!

Damit übergibst du der Funktion die Adresse der Variablen p und nicht 
deren Inhalt (die Adresse deines Arrays)

>lcd_string( Buffer ); // funktioniert!
Das geht, weil Arrays angesprochen werden, indem ein Zeiger auf das 
erste Element des Arrays übergeben wird.

von dfgh (Gast)


Lesenswert?

Nachtrag: Dr. Sommer hat mit seiner Anmerkung über die Vergänglichkeit 
des Arrays natürlich auch noch recht -> beherzige beides und erstell dir 
ein globales Array Buffer[], dass du dann der Funktion übergibst. Die 
schreibt in das übergebene globale Array...

von sam (Gast)


Lesenswert?

ah okay, danke.
Das der Arrayinhalt gelöscht wird, wenn die Funktion beendet wird hatte 
ich nicht bedacht.

Danke!

Gruß,
Sam

von Dirk B. (dirkb2)


Lesenswert?

sam schrieb:
> Das der Arrayinhalt gelöscht wird, wenn die Funktion beendet wird hatte
> ich nicht bedacht.

Er wird nicht gelöscht.
Der Speicherplatz wird wieder für etwas anderes benutzt.

Das gemeine daran ist, dass es so funktionieren kann, wie du es gemacht 
hast.
Es ist aber trotzdem falsch.

Schalt mal alle Warnungen bei deinem Compiler an (beim gcc ist das 
-Wall)
Beachte die Warnungen und behebe deren Ursache.
Denn alle genannten Hinweise erkennt auch der Compiler.

von Rolf M. (rmagnus)


Lesenswert?

Dirk B. schrieb:
> Schalt mal alle Warnungen bei deinem Compiler an (beim gcc ist das
> -Wall)

-Wall schaltet bei weitem nicht alle Warnungen ein. Das mindeste sollte 
sowas sein wie "-std=c99 -pedantic -Wall -Wextra".
Manche Warnungen kommen sogar nur, wenn man Optimierung einschaltet, da 
der Compiler erst dann eine detailierte Codeflussanalyse macht und 
dadurch mehr Fehler erkennen kann.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.