Malloc sur un paramètre de pointeur échouant

J’ai les lignes de code suivantes:

struct c_obj_thing *object = NULL; c_obj_initalizer(object); // at this point, (object == NULL) is 'true' printf("Value: %d\n", object->value); // this segfaults 

Voici la définition de c_obj_initalizer:

 int c_obj_initalizer(struct c_obj_thing *objParam) { objParam = malloc(sizeof(struct c_obj_thing)); objParam->pointerThing = NULL; objParam->value = 0; return 0; } 

Pourquoi le malloc dans la méthode c_obj_initalizer ne rest-t-il pas attaché au pointeur transmis en tant que paramètre lorsque la méthode retourne? Il semble que l’appel à l’initalizer ne fasse rien. Je me rends compte que passer un c_obj_thing réel comme pointeur signifierait que les modifications apscopes à l’initalizer ne sont pas revenues, mais je pensais que cette mémoire dynamic se perpétuait tout au long du programme.

Parce que lorsque vous appelez une fonction, celle-ci envoie une copie du pointeur, lorsque vous la modifiez dans la fonction, vous ne modifiez pas la méthode d’appel. Vous devez le malloc avant l’initialiseur.

Par exemple:

 struct c_obj_thing *object = malloc(sizeof(struct c_obj_thing)); c_obj_initalizer(object); printf("Value: %d\n", object->value); // this segfaults int c_obj_initalizer(struct c_obj_thing *objParam) { objParam->pointerThing = NULL; objParam->value = 0; return 0; } 

Si vous avez besoin pour quelque raison que ce soit de l’allocation dans la fonction c_obj_initalizer , vous devez passer de pointeur en pointeur vers cette fonction:

 int c_obj_initalizer(struct c_obj_thing ** objParam) { *objParam = malloc(sizeof(struct c_obj_thing)); *objParam->pointerThing = NULL; *objParam->value = 0; return 0; } 

et que d’appeler comme ça:

 struct c_obj_thing *object = NULL; c_obj_initalizer(&object);