C Double pointeur sur la structure

J’essaie d’élaborer un double pointeur sur une structure en C et je ne peux pas comprendre ce qui ne va pas …

typedef struct { int member; } mystruct; void myfunc(mystruct **data) { (*data)->member = 1; } void main(int argc, char *argv[]) { mystruct **data; myfunc(data); printf("member = %d\n", (*data)->member); } 

Une question similaire a été posée ici: Comment travailler avec pointeur à pointeur sur structure en C? sur la façon de modifier un membre d’une structure par le biais d’un double pointeur. La solution était la syntaxe (*data)->member = 1; ce qui a du sens. Mais dans ma petite application ici, je reçois une erreur de segmentation lors de l’exécution de cette ligne. Qu’est-ce que je fais mal?

Merci

Vous devez indiquer quelque chose si vous voulez déréférencer un pointeur. Essaye ça:

 void main(int argc, char *argv) { mystruct actualThing; mystruct *pointer = &actualThing; mystruct **data = &pointer; myfunc(data); printf("Member: %d", (*data)->member); } 

Vous avez reçu une erreur de segmentation parce que vous n’avez pas alloué de structure.

La valeur des data est un déchet, elle pointe donc vers un emplacement en mémoire qui n’est pas la propriété de votre processus ou qui est par ailleurs inaccessible.

Vous devez d’abord allouer un object de type mystruct . Voici un exemple de travail pour vous: http://ideone.com/XIdJ8

data ne sont pas initialisées et ne pointent par conséquent sur aucune adresse mémoire sensible. De plus, il n’y a pas de structure mystruct flottante, il n’y a donc vraiment aucune donnée sensible à pointer. Pour votre exemple, vous voulez:

  1. Créer un mystruct .
  2. Faites un pointeur vers elle.
  3. Faites un pointeur sur ce pointeur.

Si vous devez seulement passer le pointeur double à une fonction de bibliothèque, vous n’avez pas besoin de créer de variable pour cela. Vous créez une variable de pointeur normale, vous l’initialisez pour pointer sur la mémoire appropriée (si la fonction le requirejs), puis vous transmettez l’adresse du pointeur (créant ainsi le double pointeur “à la volée”).

Je n’ai jamais utilisé libusb, je vais donc donner un exemple utilisant une fonction de bibliothèque standard. De la page de manuel:

  #include  long int strtol(const char *nptr, char **endptr, int base); 

Cela ressemble seulement à un double pointeur. C’est vraiment un pointeur unique simulé-passer par référence. Permettre à la fonction de renvoyer des informations supplémentaires en plus de sa valeur de retour normale. strtol renvoie un entier long, mais il peut également vous indiquer à quel moment le contenu de la chaîne a cessé de ressembler à un nombre.

 #include  #include  int main(void) { char *str = "99RED BALLOONS"; char *what; long num; num = strtol(str, &what, 10); printf("Quantity: %ld; Description: %s;\n", num, what); return 0; } 

Sortie:

 Quantity: 99; Description: RED BALLOONS; 

Vous lui passez un pointeur, mais le pointeur ne pointe rien.

Cela peut être plus utile:

 void main(int argc, char *argv[]) { mystruct data; mystruct *ptr = &data; myfunc(&ptr); printf("member = %d\n", (*ptr)->member); }