shakur Skrevet 11. mars 2009 Rapporter Del Skrevet 11. mars 2009 (endret) Alt for lenge siden jeg har kodet i c nå, og sliter litt med og huske hvordan jeg håndterer pekere og strukter. Gitt følgende pseudokode: typedef struct node NODE; struct node { double* d; }; int main() { NODE *no; enMetode(no); printf("%d", no->[0]); } void enMetode(NODE *n) { n = enAnnenMetode(); n->d[0] = 3.14; } *NODE enAnnenMetode() { NODE *m = malloc(sizeof (NODE)); m->d = malloc(sizeof (double)*MAX); return m; } Hva gjør jeg feil her? Ser ut til at minneallokeringen jeg gjør i enAnnenMetode() blir borte når enMetode() returnerer. Endret 11. mars 2009 av shakur Siter Lenke til kommentar
GeirGrusom Skrevet 11. mars 2009 Rapporter Del Skrevet 11. mars 2009 I enMetode så er NODE *n bare en peker. Det det virker til at du egentlig er ute etter, er en peker til en peker her void enMetode(NODE **n) { *n = enAnnenMetode(); *n->d[0] = 3.14; } og i main kaller du enMetode(&no); Grunnen er at når enMetode blir kalt, så kopieres bare denne pekeren, og det at du endrer pekeren i funksjonen vil ikke følge med når funksjonen er ferdig, så dette er egentlig en memory leak. Siter Lenke til kommentar
shakur Skrevet 12. mars 2009 Forfatter Rapporter Del Skrevet 12. mars 2009 I enMetode så er NODE *n bare en peker.Det det virker til at du egentlig er ute etter, er en peker til en peker her void enMetode(NODE **n) { *n = enAnnenMetode(); *n->d[0] = 3.14; } og i main kaller du enMetode(&no); Grunnen er at når enMetode blir kalt, så kopieres bare denne pekeren, og det at du endrer pekeren i funksjonen vil ikke følge med når funksjonen er ferdig, så dette er egentlig en memory leak. Takk for svar, det er vel uansett ikke en veldig pen løsning synes jeg. Koden min var hentet fra en oppgavetekst, men den er nå forandret slik at enAnnenmetode() er også void og tar NODE *n som argument. Da blir det litt lettere. Siter Lenke til kommentar
Anbefalte innlegg
Bli med i samtalen
Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.