web-dev-qa-db-fra.com

Passer le pointeur struct pour fonctionner en c

J'ai un problème avec le passage d'un pointeur vers une structure vers une fonction. Mon code est essentiellement ce qui est montré ci-dessous. Après avoir appelé modify_item dans la fonction principale, stuff == NULL. Je veux que le truc soit un pointeur vers une structure d'élément avec un élément égal à 5. Qu'est-ce que je fais mal?

void modify_item(struct item *s){
   struct item *retVal = malloc(sizeof(struct item));
   retVal->element = 5;
   s = retVal;
}

int main(){
   struct item *stuff = NULL;
   modify_item(stuff); //After this call, stuff == NULL, why?
}
19
Swiss

Parce que vous passez le pointeur par valeur. La fonction fonctionne sur une copie du pointeur et ne modifie jamais l'original.

Soit passez un pointeur sur le pointeur (c'est-à-dire un struct item **), ou plutôt que la fonction renvoie le pointeur.

26
void modify_item(struct item **s){
   struct item *retVal = malloc(sizeof(struct item));
   retVal->element = 5;
   *s = retVal;
}

int main(){
   struct item *stuff = NULL;
   modify_item(&stuff);

ou

struct item *modify_item(void){
   struct item *retVal = malloc(sizeof(struct item));
   retVal->element = 5;
   return retVal;
}

int main(){
   struct item *stuff = NULL;
   stuff = modify_item();
}
22
Doug Currie

Vous pouvez également faire référence au pointeur:

void modify_item(struct item* &s){
   struct item *retVal = (struct item*)malloc(sizeof(struct item));
   retVal->element = 5;
   s = retVal;
}

int main(){
   struct item *stuff = NULL;
   modify_item(stuff); //After this call, stuff == NULL, why?
    cout<<stuff->element;
    return 0;
}
0
Sumit Badsara