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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.