shakur Skrevet 11. mars 2009 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 Lenke til kommentar
GeirGrusom Skrevet 11. mars 2009 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. Lenke til kommentar
shakur Skrevet 12. mars 2009 Forfatter 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. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå