Domanda

Ho bisogno di aiuto con i puntatori in C. Ho due strutture una struttura fatta in questo modo:

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


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

E ho una funzione come questa:

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
}

Questo sta generando un errore. Ho bisogno della struttura RD per puntare a B come nell'esempio. Devo archiviare un doppio puntatore perché S2 è collegato in modo simile a una lista, quindi ho bisogno del ** puntatore per avere la possibilità di rimuovere il primo elemento dell'elenco. Stavo facendo l'incarico nel commento come rd-> d = & b, ma quando provo a deferenziare il campo "d" in una funzione ho una memoria non valida lettura e non riesco a capire perché.

È stato utile?

Soluzione

Suppongo che il problema sia questo:

Passi dentro s2* b come argomento a modify, quindi questo puntatore risiede nello stack. Ora quando assegni rd->d = &b, prendi quella posizione sullo stack, che sarà valida solo fino a quando l'esecuzione non lascia l'ambito di modify. Quindi, quando si fa da fare rd->d Più tardi, accedi a quella posizione (ora non valida) sullo stack, che produce immondizia o un incidente. (Tuttavia, in questo scenario, dovresti essere in grado di dereference rd->d correttamente mentre è ancora dentro modify.)

Probabilmente vorresti modificare come b viene passato in modifica, molto probabilmente in qualcosa di simile s2** b, in modo da poter passare correttamente in un puntatore a un puntatore a s2 in un'altra struttura, invece di renderlo un puntatore a s2 seduto sullo stack per modify.

Fondamentalmente come questo:

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

E chiamalo come

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

Questo dovrebbe consentire di passare la posizione di un puntatore a un s2 istanza che puoi archiviare e dereference anche dopo modify finisce (non testato, però).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top