PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : speicher außerhalb einer funktion verwenden



rosenstolz
11-03-2003, 11:16
Hallo,

hat jemand von euch damit erfahrung:

ich übergeben einer funktion einen zeiger auf "int", in dieser funktion reserviere ich mit malloc bzw. realloc speicher (für int) fülle den speicher mit zahlen. kann ich jetzt den übergebenen int-Zeiger auf die addresse, welche von malloc/realloc zurückgegebenen wird, setzen. um so den reservierten speicher inkl. daten nach beendigung der funktion weiterzuverwenden ?

also einfach ausgedrückt, kann speicher welcher innerhalb einer funktion reserviert wird auch nach beendigung dieser verwendet werden ??


danke, martin

micha
11-03-2003, 12:42
Hi,


Original geschrieben von rosenstolz
ich übergeben einer funktion einen zeiger auf "int", in dieser funktion reserviere ich mit malloc bzw. realloc speicher (für int) fülle den speicher mit zahlen. kann ich jetzt den übergebenen int-Zeiger auf die addresse, welche von malloc/realloc zurückgegebenen wird, setzen. um so den reservierten speicher inkl. daten nach beendigung der funktion weiterzuverwenden ?


Bei Deinem Beispiel ist die Variable ja schon außerhalb der Funktion und kann deshalb nach beenden der Funktion auch weiterverwendet werden.



also einfach ausgedrückt, kann speicher welcher innerhalb einer funktion reserviert wird auch nach beendigung dieser verwendet werden ??


Wenn der Speicher dynamisch erzeugt wird, ja:



int *foo (void)
{
int *bar = (int*)malloc (sizeof(int));
*bar = 5;
return (bar);
}

int main (void)
{
int *res = foo ();
printf ("result: %i\n", *res);
free (res);
return (0);
}


Bei Deinem oberen Beispiel ist eine dynamische Reservierung nicht notwendig, da Du ja schon die Adresse der Variablen mit übergibst:



void foo (int *bar)
{
*bar = 5;
}

int main (void)
{
int res;
foo (&res);

printf ("result: %i\n", res);
return (0);


Gruß micha

anda_skoa
11-03-2003, 13:38
Wenn du einen Pointer übergibst, wird die Pointervariable selbst kopiert, d.h. eine Änderung der Variable bewirkt nicht, dass die externe Variable auf den neuen Speicher zeigt.

Du kannst es entweder mit einem return machen, wie micha geschrieben hat, oder du übergibts einen int**, also einen Pointer auf den Pointer, oder, im Falle von C++, eine Referenz auf den Pointer.

Ciao,
_

rosenstolz
11-03-2003, 14:37
danke erst einmal für eure antwort.


anda_skoa: meiner meinung nach kann ich doch einen zeiger immer und immer wieder auf eine andere andresse zeigen lassen. dadurch dann die variable unter dieser adresse ändern.


mein bsp:

#define PAKET 256

struct xy
{
int *zgr;
int in;
int out;
}


void func(struct xy *ab)
{
ab->zgr=malloc(PAKET*sizeof(int));

/* nun wird der reservierte speicher gefüllt */

}



int main(void)
{
int a;
struct xy ab;

func(&ab);

for(a=0; a<PAKET; a++)
printf("%d \n", ab.zgr[a]);

return(0);

}


also so ungefähr sollte das aussehen




gruß martin

rosenstolz
11-03-2003, 14:39
oh... kann das mal jemand bitte verschieben unter "speicher außerhalb einer funktion verwenden "

danke ,o)

anda_skoa
11-03-2003, 17:53
Original geschrieben von rosenstolz
oh... kann das mal jemand bitte verschieben unter "speicher außerhalb einer funktion verwenden "


kein Problem :)

Ciao,
_

anda_skoa
11-03-2003, 17:55
Original geschrieben von rosenstolz

void func(struct xy *ab)
{
ab->zgr=malloc(PAKET*sizeof(int));

/* nun wird der reservierte speicher gefüllt */

}


Das geht schon.

Aber du kannst eine Änderung an ab selbst außen nicht sehen.

Ciao,
_

rosenstolz
12-03-2003, 08:36
joah das klappt wunderbar, so wie ich es brauche bzw. mir gedacht habe ;)
danke...



gruß martin