Anfängerproblem mit Funktion, die Zeiger auf char[] zurückgibt

Gast #3982984
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
}
Gast #3982998
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.
Gast #3983000
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.
Gast #3983006
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...
#3983307
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.
#3983326
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren