Hi,
ich hab ein Problem: Ich habe ein Programm, dass viele char *Pointer macht, diese dann Pointer=(char *)malloc(x) mit der Größe x alloziiert, und sie nachher wieder freigibt(free(Pointer);). Das Programm hat aber auch globale Variablen, wann soll ich diese free()'en, kurz vor main()-return(), oder vielleicht gar nicht.
Ein ähnliches Problem habe ich mit einer Funktion die einen ge'malloc()'ten char* zurückgeben soll, wann soll diese den Zeiger am besten freigeben
Ich hoffe ich könnt mir weiterhelfen...
Danke schon mal im Vorraus Weissi
malloc und free
Re: malloc und free
Globale Daten freigeben ??
Kurz vor return() in main() macht wenig Sinn da das Programm ohnehin vor der Beendigung steht.
Wenn Du aber in Subroutines irgend welche Work-Strings mit malloc anlegst und später im Hauptprogramm nicht brauchst, dann kannst Du sie vor dem return zum Hauptprogramm wieder freigeben (free).
Ich bin mir aber nicht ganz sicher ob ich dein Posting ganz verstanden haben.
Greetz Sulu
Kurz vor return() in main() macht wenig Sinn da das Programm ohnehin vor der Beendigung steht.
Wenn Du aber in Subroutines irgend welche Work-Strings mit malloc anlegst und später im Hauptprogramm nicht brauchst, dann kannst Du sie vor dem return zum Hauptprogramm wieder freigeben (free).
Ich bin mir aber nicht ganz sicher ob ich dein Posting ganz verstanden haben.
Greetz Sulu
Re: malloc und free
Thnx erstmal, die erste Frage hattest du rihtig verstanden, und ich werde das jetzt auch so machen )
Aber die 2. hattest du, glaub ich, etwas falsch verstanden. Dass ich die Pinter kurz vor dem return in die main() (oder andere) free'e, ist klar. Aber was ist wenn diese Funktion diesen Zeiger zurückegeben soll, dann kann ich den ja schlecht davor free'en. Ich habe mich jetzt ein bisschen mit Pointern auseinandergesetzt und werde heute Abend mal testen, ob ich die nicht einfach in der main() aus free'en kann...
Ein Beispiel
char *func() {
char *test;
test=(char *)malloc(100);
strcpy(test, "hallo, das ist ein Test!!!");
return(test);
}
main() {
char *t2;
t2=(char *)malloc(100);
strcpy(t2, func() );
printf ("%s", t2);
free(t2);
return 0;
}
Aber die 2. hattest du, glaub ich, etwas falsch verstanden. Dass ich die Pinter kurz vor dem return in die main() (oder andere) free'e, ist klar. Aber was ist wenn diese Funktion diesen Zeiger zurückegeben soll, dann kann ich den ja schlecht davor free'en. Ich habe mich jetzt ein bisschen mit Pointern auseinandergesetzt und werde heute Abend mal testen, ob ich die nicht einfach in der main() aus free'en kann...
Ein Beispiel
char *func() {
char *test;
test=(char *)malloc(100);
strcpy(test, "hallo, das ist ein Test!!!");
return(test);
}
main() {
char *t2;
t2=(char *)malloc(100);
strcpy(t2, func() );
printf ("%s", t2);
free(t2);
return 0;
}
Re: malloc und free
Hi.
Die Rüchgabe von Pointer über return, für doch zu Schwierigkeiten, da im Normalfall eine nur eine Kopie des Wertes (Call by Copy) zurückgegeben wird. Man kann aber mit der Funktion einen Pointer übergeben an den die Funktion dann den Speicher zuweist:
void test(char*);
dann muß dieser Speicher in der Main, bzw. in der aufrufenden Funktion, zersört werden.
Für das erste Problem, zerstören von globalen Speicher, kann man mit der funktion:
void atexit( void(*funktion)(void) );
funktionen registrieren. Diese Funktionen werden beim verlassen des Programms mit exit(), im LIFO Pripzip aufgerufen.
Die Rüchgabe von Pointer über return, für doch zu Schwierigkeiten, da im Normalfall eine nur eine Kopie des Wertes (Call by Copy) zurückgegeben wird. Man kann aber mit der Funktion einen Pointer übergeben an den die Funktion dann den Speicher zuweist:
void test(char*);
dann muß dieser Speicher in der Main, bzw. in der aufrufenden Funktion, zersört werden.
Für das erste Problem, zerstören von globalen Speicher, kann man mit der funktion:
void atexit( void(*funktion)(void) );
funktionen registrieren. Diese Funktionen werden beim verlassen des Programms mit exit(), im LIFO Pripzip aufgerufen.
Re: malloc und free
Hi mal wieder,
stimmt, das kann man machen, (ich habe einen Teil aus einem Buch gelsen, in dem es um Pointer geht, jetzt weiss ich wie das geht )) )man kann aber auch ohne Probleme einen Pointer zurückgeben.
z.B.
int * meinFunc();
main() {
int * ganzeZahl;
int nochNeGanze;
ganzeZahl = meinFunc();
&nochNeGanze = meinFunc();
printf ("Entweder so: &d oder so &d", *ganzeZahl, nochNeGanze);
return (*ganzeZahl + nochNeGanze);
}
int * meinFunc() {
int * zeiger;
*zeiger = 1 * 2 + 3;
return zeiger;
}
Genau so kann man das auch mit char *'s machen, wenn man sie zuvor ge'malloc't hat, dann free()'d man sie halt in der main, oder sonstwo. Man muss halt nur aufpassen, dass sie auch im richtigen Moment ge'malloc't ist...
Weissi
stimmt, das kann man machen, (ich habe einen Teil aus einem Buch gelsen, in dem es um Pointer geht, jetzt weiss ich wie das geht )) )man kann aber auch ohne Probleme einen Pointer zurückgeben.
z.B.
int * meinFunc();
main() {
int * ganzeZahl;
int nochNeGanze;
ganzeZahl = meinFunc();
&nochNeGanze = meinFunc();
printf ("Entweder so: &d oder so &d", *ganzeZahl, nochNeGanze);
return (*ganzeZahl + nochNeGanze);
}
int * meinFunc() {
int * zeiger;
*zeiger = 1 * 2 + 3;
return zeiger;
}
Genau so kann man das auch mit char *'s machen, wenn man sie zuvor ge'malloc't hat, dann free()'d man sie halt in der main, oder sonstwo. Man muss halt nur aufpassen, dass sie auch im richtigen Moment ge'malloc't ist...
Weissi