PDA

View Full Version : [C]help memoria che cambia il suo contenuto da sola


spk
29-10-2007, 19:30
Salve a tutti, gia ringrazio anticipatamente per le risposte.

Il mio problema riguarda questo codice:
#include <stdio.h>

struct disco
{
int id;
int sl;
struct disco *succ;
}x={0, 1000000, NULL};
struct disco *primo=&x;

float totale=0;
int n_dischi=1;

void inserisci(struct disco *uno, struct disco *due, struct disco *nuovo)
{
if(nuovo->sl < due->sl)
{
nuovo->succ=due;
uno->succ=nuovo;
}
else
{
if(due->succ == NULL)
{
due->succ=nuovo;
}
else
{
inserisci(due, due->succ, nuovo);
}
}
}

void inserisci_disco(struct disco *nuovo)
{
if(nuovo->sl < primo->sl)
{
nuovo->succ=primo;
primo=nuovo;
}
else
{
if(primo->succ == NULL)
{
primo->succ=nuovo;
}
else
{
inserisci(primo, primo->succ, nuovo);
}
}
}

void nuovo_file(int dfile)
{
if (primo->sl >= dfile)
{
primo->sl -= dfile;
totale += dfile;
}
else
{
struct disco nuovo={n_dischi, (1000000-dfile), NULL};
inserisci_disco(&nuovo);
n_dischi++;
totale += dfile;
// primo.succ=&nuovo;
}
}

void to_string(struct disco *d)
{
if(d->succ == NULL)
{
printf("file size sum\t= %1.6f GB\ntotal disk\t= %d\n",(totale/1000000),n_dischi);
printf("\t%d %d:\n",d->id,d->sl);
}
else
{
to_string(d->succ);
printf("\t%d %d:\n",d->id,d->sl);
}
}

int main()
{
nuovo_file(500000);
nuovo_file(300000);
nuovo_file(700000);
printf("pippo %i\n",primo->succ->id);
printf("pippo %i\n",primo->succ->id);
printf("pippo %i\n",primo->succ->id);
//nuovo_file(710000);
to_string(primo);
return 0;
}


L'obiettivo era quello di creare una lista ordinata di dischi secondo "sl" (ovvero Spazio Libero). L'esercizio non presenta difficoltà fino a quando scopro che...non so nemmeno come definirlo...perdo dati.
Se notate nel main() eseguo 3 printf identiche tutte di seguito all'altra.
Ora quando mando in esecuzione invece di scrivermi 3 volte il valore esatto mi fa questo tipo di output:
./a.out
pippo 1
pippo -1079252524
pippo -1079252524
Segmentation fault (core dumped)

La stessa cosa succede ipotizzo anche al puntatore del "disco successivo" rendendomi perciò impossibile continuare il tutto.
Sapreste dirmi come risolvere il problema? Cosa sbaglio? :muro:

andbin
29-10-2007, 19:41
Nella funzione nuovo_file(), la variabile struct disco nuovo è locale. Vuol dire che quando la funzione termina, quella variabile sparisce!
Certo .. l'indirizzo &nuovo l'hai passato a inserisci_disco() ma una volta che nuovo_file() termina e magari successivamente chiami altre funzioni, cosa ci sia sullo stack a quell'indirizzo .... non si sa....

spk
29-10-2007, 19:47
Rapidissimo e con la precisione di un chirurgo, io ero convinto che fin quando c'era una qualcosa che puntava a un qualcos'altro quest'ultimo non veniva liberato.
Ho spostato "struct disco nuovo" e ora è accessibile.
Ora sembra funzionare (ancora non va tutto come dovrebbe ma almeno le variabili sono quello che dovrebbero essere)
grazie :D

andbin
29-10-2007, 20:01
io ero convinto che fin quando c'era una qualcosa che puntava a un qualcos'altro quest'ultimo non veniva liberato.C/C++ != Java/C# :asd:

Ho spostato "struct disco nuovo" e ora è accessibile.
Ora sembra funzionare (ancora non va tutto come dovrebbe ma almeno le variabili sono quello che dovrebbero essere)Ti conviene gestire la allocazione del "nodo" in modo dinamico.
<qui> (http://www.hwupgrade.it/forum/showthread.php?t=1526774) avevo fatto un esempio basilare di inserimento in una lista linkata.

spk
29-10-2007, 21:17
Ho rifatto tutto usando il codice della pagina da te linkata come nocciolo da ampliare. Ho un po di difficoltà a capire dei passaggi, piu' che capire intuisco :asd:

Grazie di nuovo :)