Zeiger an Funktion übergeben. Zeiger zeigt auf nichts nach Funktionsende

Gast #1552162
Lesenswert?

Hallo zusammen

Ich steh irgendwie auf dem Schlauch.
Dem Pointer in test wird keine Adresse zugewiesen.
Beim debuggen zeigt zwar telex_in vor dem beenden der Funktion 
receivetelex auf die richtige Adresse, aber sobald ich wieder in der 
Funktion test bin sehe ich einen uninitalisierten Pointer.
1
void test(void)
2
{
3
unsigned char *P_telex;  
4

5
 status = receivetelex(P_telex); 
6
}
1
int receivetelex(unsigned char *telex_in)
2
{
3
telex_in = hole_daten();//hole pointer auf Daten.
4

5
return(INCOMING_TELEGRAMM);//Telegramm erhalten
6
}

Hat jemand von euch eine Idee?

Gruss und Dank

Michael
Gast #1552196
Lesenswert?

Hallo Tom

So
1
unsigned char* hole_daten(void);

Aber vor den Return bevor die Funktion beendet wird zeigt mir der 
debugger die richtige Adresse an also telexin zeigt auf die richtige 
Adresse.

Gruss Michael
#1552205
Lesenswert?

In receivetelex ist telex_in ein lokale Kopie von P_telex. Wenn du 
dort telex_in veränderst, dann veränderst du auch wirklich nur das 
(und nicht auch P_telex).
Was du anscheinend eigentlich haben willst:
1
void test(void)
2
{
3
  unsigned char *P_telex;  
4

5
  status = receivetelex(&P_telex); 
6
}
7

8

9
int receivetelex(unsigned char **telex_in)
10
{
11
  *telex_in = hole_daten();//hole pointer auf Daten.
12

13
  return(INCOMING_TELEGRAMM);//Telegramm erhalten
14
}
Persönliche Seite #1552214
Lesenswert?

Und was genau geschieht beim Aufruf von receive_telex? Dem übergibst 
Du einen Pointer. Und diesen Pointer überschreibst Du mit dem Ergebnis 
von hole_daten.

Pointer werden als Kopie ihrer selbst an Funktionen übergeben, so, wie 
es bei anderen Datentypen (int etc.) auch geschieht.
Während der Laufzeit der Funktion befindet sich diese Kopie auf dem 
Stack, eine Änderung bewirkt nach Beendigung der Funktion nichts.

Um das zu erzielen, was Du eigentlich vorhast, musst Du receive_telex 
einen Pointer auf einen Pointer übergeben, und das Ergebnis von 
hole_daten dem dereferenzierten Pointer übergeben:
1
void test(void)
2
{
3
unsigned char *P_telex;  
4

5
 status = receivetelex(&P_telex); 
6
}
7

8
int receivetelex(unsigned char **telex_in)
9
{
10
*telex_in = hole_daten();//hole pointer auf Daten.
11

12
return(INCOMING_TELEGRAMM);//Telegramm erhalten
13
}

Zu klären wäre noch, wie in hole_daten der Rückgabewert bestimmt wird; 
das darf nicht die Adresse eines lokalen (auf dem Stack angelegten) 
Arrays sein.
Gast #1557572
Lesenswert?

Vielen Dank

Ja das war das Problem.

Mein Überlegungsfehler war das die übergebenen Werte nur Kopien sind.

@Klaus, Jo es isch nid liecht mit söfu verschidne Schproche do chunsch 
scho mou äs glir im Gring. ;-)

Gruss und Dank

Michael

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