[C] Aufruf funktion_1(funktion_2) kill Rückgabewert von funktion_2

mc_gulasch

Erfahrenes Mitglied
Haaalloooo Forum,

ich hab eine Funktion, die folgenden Aufruf und Rückgabewert hat:
C:
unsigned char* funktion_2  (unsigned char *string)
Wenn ich mir den Rückgabewert der Funktion anschaue und ausgeben lasse...prima!
Dann hab ich eine zweite Funktion
C:
void funktion_1(unsigned char *string)
Das ganze rufe ich dann auf:
C:
funktion_1(funktion_2(string))
Jetzt kommt das DICKE Problem: Der String wird zur funktion_1 richtig übergeben, aber dann wird der Speicher mit den String - Elementen von meiner fopen() - Funktion (in funktion_1 aufgerufen) überschrieben. Von welcher Funktion es letztendlich überschrieben wird, ist auch vollkommen egal, aber ich frage mich:
a) WIE kann sowas passieren?
b) DARF soetwas passieren (gerade in C)?
Kurios ist auch, dass folgendes klappt:
C:
char output[256];
strcpy(output,funktion_2(string));
funktion_1(output);
Hat jemand ne Erklärung dafür oder mach ich hier grundlegend was falsch?

Thx @ all

Gulasch
 
Hi.

Ich vermute mal du hast in der Funktion funktion_2 soetwas gemacht wie
C:
unsigned char* funktion_2  (unsigned char *string) {
  auto char result[100]; 
  ...
  return result;
}
Das geht natürlich nicht. Du kannst keinen Zeiger auf eine automatische Variable zurückgeben, da der Speicher dafür auf dem Aufrufstack alloziert wird und automatisch wieder freigegeben wird sobald der Skopus der Funktion verlassen wird. Danach wird der Wert auf dem Stack überschreiben sobald man eine weitere Funktion aufruft.

Du mußt entweder einen statische Variable verwenden bzw. neuen Speicher allozieren, der dann von der aufrufenden Funktion wieder freigegeben werden muß.

Gruß
 
Da hast du wohl mal wieder recht. So in etwas (zwar ohne "auto") siehts aus und eine Begründung in der Art, hab ich mir auch schon zurechtgelegt.
Wenn ich in meiner funktion_2 die output-Variable "static" mache funktionierts, allerdings hab ich dazu noch ne Frage:
Die Funktion wird in meinem Programm ständig aufgerufen, wird dadurch nicht auch ständig eine static Output-Variable erzeugt, womit ich ein kleines Speicherproblem kriegen könnte? Mir ist noch nicht so ganz klar, wie bzw. wo static überall arbeitet.
Bei dem Code oben zum Beispiel:
C:
unsigned char* funktion_2  (unsigned char *string) {

  static char result[100]; 

  ...

  return result;

} 

int main (void)
{
 int i = 0
 for (i=0;i<MAX;i++) //MAX >> 100 000
 {
  funktion_1 (funktion_2);
 }
 return 0;
}
Wird hierbei nicht MAX-mal eine static - Variable definiert und bis zum Ende des Programms nicht gelöscht (aus dem Speicher) oder wie muss ich mir das vorstellen :confused:

Danke schonmal.
 
Wird hierbei nicht MAX-mal eine static - Variable definiert und bis zum Ende des Programms nicht gelöscht (aus dem Speicher) oder wie muss ich mir das vorstellen

Nein, sie wird nur einmal definiert, der Speicher für result + Inhalt bleibt nämlich die ganze Laufzeit des
Programmes bestehen...

Siehe:
http://home.fhtw-berlin.de/~junghans/cref/CONCEPT/storage_class.html#static

Aber aufpassen:
static in Bezug auf Deklarationen globaler Funktionen und Variablen hat noch
eine ganz andre Bedeutung :)
Siehe:
http://home.fhtw-berlin.de/~junghans/cref/SYNTAX/static.htm
Der letztere Link gilt wie schon erwähnt auch für die Deklaration von globalen
Variablen...

Gruß,
RedWing
 
Zuletzt bearbeitet:
Wunderbar. Ich danke dir vielmals. Der erste Link beschreibt ja haargenau mein Problem, das find ich fein. Ausserdem machts ja nix aus nen char-Array zu überschreiben, da dieser ja ohnehin mit '\0' endet (aber ich denke schon wieder laut).
Coole Sache auf jeden Fall .. ich freu mich! :-D
 
Zurück