Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Comparazioni banali fra pointer con risultati inaspettati
Forum - C/C++ - Comparazioni banali fra pointer con risultati inaspettati

Avatar
giulioscatto (Normal User)
Rookie


Messaggi: 37
Iscritto: 03/08/2009

Segnala al moderatore
Postato alle 23:47
Mercoledì, 29/06/2011
Salve a tutti, ecco qui il mio curioso (o forse stupido) problema.
In questa procedura l'argomento plist, lista di nodi linkati, dev'essere liberata dalla memoria.
Codice sorgente - presumibilmente C/C++

  1. void l_free(t_list* plist) {
  2.         t_node* old_node;
  3.         plist->pwalker = plist->phead;
  4.         do {   
  5.                 old_node = plist->pwalker;
  6.                 plist->pwalker = plist->pwalker->next;
  7.                 free(old_node->content);
  8.                 free(old_node->next);
  9.                 free(old_node);
  10.         } while(plist->pwalker != plist->ptail);
  11.         free(plist->phead); plist->phead = NULL;
  12.         free(plist->pwalker); plist->pwalker = NULL;
  13.         free(plist->ptail); plist->ptail = NULL;
  14.         free(plist); plist = NULL;


plist contiene il puntatore al nodo testa e un altro al nodo coda, ed è dotata di un puntatore a nodo walker che percorre la lista in un unica direzione: ogni nodo della lista punta al successivo.

Venendo al dunque:
Codice sorgente - presumibilmente Plain Text

  1. plist->pwalker != plist->ptail

non interrompe il ciclo quando pwalker punta all'ultimo nodo, cioé quando punta allo stesso nodo di ptail (ho verificato ciò in modo da evitare inutili scivoloni).
Il fatto strano è che appendendo alla lista due volte lo stesso puntatore, il ciclo termina felicemente mentre con due puntatori a celle differenti la storia si ripete.

Avete qualcosa da proporre (oltre a lanciare il computer, o me, fuori dalla finestra?). Utilizzo il compilatore DMC (Digital Mars C/C++ Compilers).

Grazie per la vostra disponibilità.
Giulio

________________________________________________________________
MAIN
Codice sorgente - presumibilmente C/C++

  1. int main()
  2. {
  3.         int *a = malloc(sizeof(int*));
  4.         int *b = malloc(sizeof(int*));
  5.         t_list* l = l_get_new_list();
  6.         l_append(l,a); l_append(l,b);
  7.         l_free(l);
  8. }



STRUTTURE
Codice sorgente - presumibilmente C++

  1. typedef struct {
  2.         void* content;
  3.         void* next;
  4. } t_node;
  5.  
  6. typedef struct {
  7.         t_node* phead;
  8.         t_node* ptail;
  9.         t_node* pwalker;
  10. } t_list;



ALLOCAZIONE NODI E LISTA

Codice sorgente - presumibilmente C/C++

  1. t_node* l_get_new_node() {
  2.         t_node* tmp = (t_node*)h_malloc(sizeof(t_node));
  3.         tmp->content = (void*)h_malloc(sizeof(void*));
  4.         tmp->next = (t_node*)h_malloc(sizeof(void*));
  5.         return tmp;
  6. }
  7.  
  8. t_list* l_get_new_list() {
  9.         t_list* tmp = (t_list*)h_malloc(sizeof(t_list));
  10.         tmp->phead = l_get_new_node();
  11.         tmp->pwalker = tmp->phead;
  12.         tmp->ptail = tmp->phead;
  13.         return tmp;
  14. }


la funzione h(andled)_malloc gestisce automaticamente la possibilità di errore. Posto anche quella insieme a 'void fatal' per l'output dell'errore:
Codice sorgente - presumibilmente C#

  1. void fatal(char* msg) {
  2.         char emsg[128];
  3.         printf(emsg,"[!DEBUG!] error in %s:",msg);
  4.         perror(emsg);
  5.         exit(-1);
  6. }
  7.  
  8. void* h_malloc(unsigned int size) {
  9.         void *ptr;
  10.         if ((ptr = (void*)malloc(size)) == NULL) fatal("h_malloc() on memory allocation");
  11.         return ptr;
  12. }


Ultima modifica effettuata da giulioscatto il 30/06/2011 alle 21:25
PM
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 10:14
Giovedì, 30/06/2011
Puoi inviare le strutture e il main?

Sarà che sono mezzo addormentato ma non riesco a trovare il pulsante per rispondere!! Oppure lo devo scrivere qui? - giulioscatto - 30/06/11 12:10
In basso a destra c'è il tasto "Rispondi" ... - nessuno - 30/06/11 12:35
Sarò proprio addormentato allora http://imageshack.us/photo/my-images/706/immaginesr.png/ - giulioscatto - 30/06/11 12:41
Comunque, come volevasi dimostrare, utilizzando DevC++ invece del DMC tutto va alla grande, facendo una piccola modifica (eliminare la 8a riga dal primo blocco di codice postato). Grazie mille, in futuro vedrò di stare più attento! - giulioscatto - 30/06/11 13:28
nelle domande che apri non puoi rispondere, puoi solo commentare, viceversa puoi rispondere nelle discussioni che apri... - anthony015 - 30/06/11 16:37
Ah ecco! Grazie mille Anthony! - giulioscatto - 30/06/11 18:52
Posta anche l_get_new_list() e l_append()... - pierotofy - 30/06/11 19:41


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM