C double pointeur sur la Structure

J'essaie de travailler sur un double pointeur vers une structure en C et je ne peux pas comprendre ce qui ne va pas... La source simple est ci-dessous:

typedef struct
{
    int member;
} mystruct;

void myfunc(mystruct **data)
{
    (*data)->member = 1;
}

void main(int argc, char *argv[])
{
    mystruct **data;

    myfunc(data);

    printf("member = %dn", (*data)->member);
}

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

Merci

21
demandé sur Community 2011-10-03 21:40:23

5 réponses

Vous devez pointer vers quelque chose si vous allez déréférencer un pointeur. Essayez ceci:

void main(int argc, char *argv)
{
    mystruct actualThing;
    mystruct *pointer = &actualThing;
    mystruct **data = &pointer;
    myfunc(data);

    printf("Member: %d", (*data)->member);
}
18
répondu DwB 2018-05-17 13:29:29

Vous avez reçu un segfault parce que vous n'avez pas alloué de structure.

La valeur de data est une poubelle, elle pointe donc vers un endroit en mémoire qui n'appartient pas à votre processus ou qui est autrement inaccessible.

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

7
répondu Ray Toal 2011-10-03 17:47:38

data n'est pas initialisé et ne pointe donc vers aucune adresse mémoire sensible. De plus, il n'y a pas de structure mystruct flottant, donc il n'y a même pas de données sensibles à pointer. Pour votre exemple, vous voulez:

  1. Créez un mystruct.
  2. Faites un pointeur vers elle.
  3. Faites un pointeur sur ce pointeur.
5
répondu gspr 2011-10-03 17:43:23

Si vous avez seulement besoin de passer le double pointeur vers une fonction de la bibliothèque, vous n'avez pas besoin de créer une variable. Vous faites une variable de pointeur normale, initialisez-la pour pointer vers le stockage approprié (si requis par la fonction), puis passez l'adresse du pointeur (créant ainsi le double pointeur "à la volée").

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

   #include <stdlib.h>

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

Seulement ressemble comme un double pointeur. C'est vraiment un pointeur unique simulé-pass-by-reference. Permettant à 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 dire à quel point le contenu de la chaîne a cessé de ressembler à un nombre.

#include <stdio.h>
#include <stdlib.h>

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;
1
répondu luser droog 2011-10-04 05:04:54

Vous lui passez un pointeur, mais le pointeur ne pointe sur 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);
}
0
répondu Chris Eberle 2011-10-03 17:43:54