005
03.12.2004, 12:23 Uhr
RHBaum
|
Allgemein :
Die funktion / der Block, der deine Strukt allokiert, sollt sie auch wieder freigeben .....
Fuer deine Frage lauten dann die Antworten, 1. ja 2. nein :-)
Mann sollte nie, nie, nie, Speicher allokieren und den per rueckgabewert zurueckgeben .... (Es gibt jetzt sicher einige, die Beispiele bringen wo es moeglich waere, aber man sollt es sich gar ned erst angewoehnen)
In deinem konkreten Fall :
Du brauchst die Struktur nur einmal (kein feld) warum die dynamische allokation ?
Lass deinen Anwender den Speicher allokieren .....
Code: |
long DatenSchreiben(WORD Index,struct DATEN * pdata) { if(pdata) { // hier nu in deine Strukt schreiben lassen } }
|
Hat den vorteil, das dein User der funktion selber entscheidet, ob die daten aufn stack (performance) oder dynamisch anglegt werden ....
Code: |
// irgendwo im code // statische Version struct DATEN data;
long lreturn = DatenSchreiben(4,&data);
// Dynamische version struct DATEN * pdata; pdata=(struct DATEN *)malloc(sizeof(struct DATEN)); long lreturn = DatenSchreiben(4,pdata); free(pdata);
|
Aehnlich macht man es, wenn man die goresse des Speichers ausserhalb der funktion nicht weiss, dann allokiert man in der funktion auch ned selber einfach drauf los, sondern macht 2 versionen der Funktion ... einmal wo man den speicherbedarf ermitteln kann, einmal wo man den Speicher beschreibt ....
Am beispiel einer funktion die nen string unbekannter Laenge liefert .... sollte es ungefaehr so aussehen
Code: |
long GetString(int * ilength,char * pdata) { // implementation ueberlass ich dir :-) }
|
Verwendung:
Code: |
// wenn man bei dem datenwert nen nullzeiger uebergibt als (zieladresse, sollte die funktion nur die laenge ermitteln !!! int ilen = 0; long lreturn = GetString(&ilen,0); // laenge
// mit der Laenge koennen wir nun den speicher allokieren ! char * strbuffer = (char *)malloc(sizeof(char) * ilen); // nun die funktion den String zurueckgeben lassen lreturn = GetString(&ilen,strbuffer); // irgendwann wieder freigeben free(strbuffer);
|
Prinzip verstanden ? So manchen es zumindest die meisten c-Funktionen aus diversen libs ....
Ciao ... |