Assegnato l'indirizzo scontro di memoria
-
26-09-2019 - |
Domanda
Non capisco come questo accada. Questo è parte del mio codice ..
int isGoal(Node *node, int startNode){
int i;
.
.
}
Quando il debug questo utilizzando gdb ho scoperto che 'i' è stata assegnata a l'indirizzo di memoria che sono stati assegnati in precedenza.
(gdb)print &node->path->next
$26 = (struct intNode **) 0xffbff2f0
(gdb) print &i
$22 = (int *) 0xffbff2f0
node-> percorso-> successivo è stato già definito al di fuori di questa funzione. Ma, come u può vedere che condividono lo stesso indirizzo, che ad un certo punto fare il punto puntatore in un altro luogo, quando il i contatore è cambiato.
ho compilato utilizzando gcc su Solaris piattaforma Qualsiasi aiuta sarebbe molto apprezzato ..
Soluzione
Due possibilità:
- È stato compilato con ottimizzazioni e questo è fonte di confusione gdb (ad esempio
i
potrebbe essere ottimizzato via, in modo che non ha in realtà alcun indirizzo) -
node->path
non indica memoria allocata correttamente. Ad esempio tale puntatore poteva essere impostato per scegliere un oggetto in pila che successivamente fatto di portata.
Altri suggerimenti
La memoria per i
è presa dal risma , o quello in C è talvolta chiamato "memorizzazione automatica."
Il contenuto della memoria assegnate dalla pila non sono valide dopo la funzione dichiara che lo stoccaggio è tornato. Ad esempio, la funzione isGoal()
assegna stack di archiviazione per il i
variabile e lo stoccaggio esiste solo fino al momento in cui i rendimenti isGoal()
.
Il motivo che si vede l'indirizzo di i
, &i
ha già esisteva durante il vostro programma è che l'area di memoria di stack è continuamente riutilizzato. Prima di ciò che si vede in gdb, è stato memorizzato l'indirizzo di una variabile di stack in node->path->next
.
Per ottenere la memoria che resta valida dopo la funzione assegnazione è tornato, è necessario utilizzare malloc()
e free()
per ottenere quello che viene chiamato "memoria dinamica" o, talvolta, memoria dal "mucchio".