Question

J'ai besoin d'aide pour les pointeurs dans C. J'ai deux structures une structure faite comme ceci:

    typedef struct s{
        s2** d;
        struct s* next;
    }s;


 typedef struct s2{
        c* fi;
        struct s2* next;
    }s2;

Et j'ai une fonction comme celle-ci:

void modify(c* a, s2* b){   //c* is a pointer to a struct
    s* rd = malloc(sizeof(s);
    rd->next = NULL;
    //need also to initialize the field "d" of the "s" struct
}

Cela génère une erreur. J'ai besoin que la structure RD pointe vers B comme dans l'exemple. J'ai besoin de stocker un double pointeur car S2 est lié de manière semblable à la liste, j'ai donc besoin du ** pointeur pour avoir la possibilité de supprimer le premier élément de la liste. Je faisais l'affectation dans le commentaire comme rd-> d = & b mais lorsque j'essaie de déférence le champ "D" dans une fonction, j'ai une lecture de mémoire non valide et je ne comprends pas pourquoi.

Était-ce utile?

La solution

Je suppose que le problème est le suivant:

Tu passons s2* b comme argument de modify, ainsi ce pointeur réside sur la pile. Maintenant quand vous affectez rd->d = &b, vous prenez cet emplacement sur la pile, qui ne sera valable que jusqu'à ce que l'exécution ne quitte la portée de modify. Ainsi, lorsque vous déréférencez rd->d Plus tard, vous accédez à cet emplacement (maintenant invalide) sur la pile, qui donne des ordures ou un accident. (Cependant, dans ce scénario, vous devriez être en mesure de dégérer rd->d correctement tout en étant modify.)

Vous voudriez probablement modifier comment b est passé dans modifier, très probablement dans quelque chose comme s2** b, afin que vous puissiez passer correctement dans un pointeur vers un pointeur pour s2 dans une autre structure, au lieu d'en faire un pointeur pour s2 assis sur la pile pour modify.

Fondamentalement comme ceci:

void modify(c* a, s2** b) {
    s* rd = malloc(sizeof(s));
    rd->next = NULL;
    rd->d = b;
}

Et appelez ça comme

s2* myS2 = ...;
modify(<whatever>, &myS2->next);

Cela devrait vous permettre de passer l'emplacement d'un pointeur vers un s2 Instance que vous pouvez stocker et déréférence même après modify finitions (non testées, cependant).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top