Avatar billede smackers Nybegynder
09. september 2005 - 20:04 Der er 6 kommentarer og
1 løsning

C : passing a pointer to a struct

Jeg har lavet et lille eksempel på et større problem jeg har med pointers til structs. jeg pass'er en pointer til en struct til en funktion f(). f() skriver til en en af elementerne i struct'en og returnerer til main(). Når kontrollen er tilbage i main() kan jeg ikke længere skrive det ændrede struct element (int) ud... programmet crasher. :(

Hvad går galt?
ps. ingen globale variable!

mvh smackers

======================================


#include <stdio.h>

typedef struct node {
        int number;
}NODE;

void f(NODE * head) {
        head = (NODE*) malloc(sizeof(NODE));
        head->number = 13;
        printf("number is set to: %d\n", head->number);       
}

int main(void) {
        NODE * head;                              /* even tried "NODE * head = (NODE *) NULL;" */
        f(head);       
        printf("head->number = %d\n", head->number);            /* program crashes here */
        free(head);
        return 0;
}
Avatar billede polle007 Nybegynder
09. september 2005 - 20:07 #1
Du skal lave en pointer til en pointer. Hvis jeg husker syntaxen korrekt:

void f(NODE ** head) {
        *head = (NODE*) malloc(sizeof(NODE));
        (*head)->number = 13;
        printf("number is set to: %d\n", (*head)->number);     
}

f(&head);
Avatar billede smackers Nybegynder
09. september 2005 - 20:21 #2
hmm.. <:/

jeg har forhøjet pointene til 60 i håb om at få forklaret logikken i at skulle bruge en pointer til pointer til struct, så jeg bedre kan rette mit program.

polle007 du modtager naturligvis de først 30 point (hvis dit forslag virker) :)
Avatar billede polle007 Nybegynder
09. september 2005 - 20:24 #3
Logikken:

Din pointer peger på et område i hukommelsen. F.eks. 0x00000001 Dvs f() får en henvisning hertil. Hvis du vil ændre på indholdet af din variabel (pointeren) fra main() skal du have en pointer til denne pointer
Avatar billede erikjacobsen Ekspert
09. september 2005 - 20:25 #4
Hvis du har en pointer til en struct, kan du ændre indholdet af struct-en, der dog skal være oprettet først.

Hvis du har en pointer til en pointer til en struct, kan du ændre den oprindelige pointer til struct-en, og derfor allokere i funktionen.

(nemmere at tegne ...)
Avatar billede polle007 Nybegynder
09. september 2005 - 20:30 #5
måske dette kan hjælpe

void test(int &a){
  a = 2; // ændrer også a i main
}

void test(int *a){
  *a = 2; // ændrer også a i main
}


void test2(int a){
  a = 2; // a er lokal, a fra main ændres derfor ikke
}

main:

int a=1;
test(a);
test2(a);
Avatar billede smackers Nybegynder
09. september 2005 - 21:22 #6
Tusind tak for hjælpen!!
Det virker som det skal (indtil jeg støder på et nyt problem.. nok når det bliver tid til at implementere merge-sort-funktionen ;)

Læg svar og få nogle kastanjer.

MVH Smackers
Avatar billede smackers Nybegynder
13. oktober 2005 - 07:40 #7
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester