puntatore ai suggerimenti in c
-
27-10-2019 - |
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é.
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ò).