Entra

View Full Version : [C/C++] Dubbio sulle liste


zanardi84
13-07-2011, 08:51
Un dubbio che vorrei levarmi:

Una lista è una struttura dati globale?
Nel momento in cui inserisco gli elementi usando una funzione, la lista che viene creata resta a disposizione di tutto il programma, come se fosse una sorta di variabile globale, giusto?
E rimane in memoria finchè è aperto il programma che la sta trattando. Giusto?

GByTe87
13-07-2011, 09:20
No, funziona come tutte le altre strutture, quindi secondo le regole di scoping classiche.

BlackShark92
13-07-2011, 13:33
No, la lista non è altro che un tipo di struttura dati (quindi ha lo stesso funzionamento delle altre strutture) dove uno dei campi della struttura è un puntatore ad un altro nodo della lista. Stop. Devi immaginare come se gli anelli di una catena sono i nodi, e i "ganci" sono i puntatori ai nodi successivi. ;)

zanardi84
13-07-2011, 14:07
No, funziona come tutte le altre strutture, quindi secondo le regole di scoping classiche.

Ma la visibilità? E' globale o è ridotta solo alle funzioni che la usano?
E In memoria ci sta finchè non muore il programma che la sta gestendo?

GByTe87
13-07-2011, 14:14
Ma la visibilità? E' globale o è ridotta solo alle funzioni che la usano?

Non si discosta da quanto succede per le altre strutture dati e tipi primitivi; sono globali solo se le dichiari tali.

Idem per quanto riguarda l'allocazione.

pinosx
14-07-2011, 17:29
se la dichiari prima del main per esempio, la puoi usare all'interno del main e di tutto le procedure e funzioni che seguono...
poi, in una lista, che fa uso di puntatori, ci puoi mettere quanti campi vuoi, (tipo nome, cognome, età, codice fiscale) basta che alla fine metti uno (o due nel caso di lista doppiamente linkata) puntatori che puntano alla stessa lista...

es:
struct nodo
{
int valore;
nodo *succ;
nodo *prec;
};

class lista
{
nodo *l;
...
...
...
};

spero di esserti stato di aiuto...

WarDuck
14-07-2011, 23:23
Ma la visibilità? E' globale o è ridotta solo alle funzioni che la usano?
E In memoria ci sta finchè non muore il programma che la sta gestendo?

Dal punto di vista della memoria, se usi delle malloc per allocare i nodi stai allocando nell'heap, quindi di fatto in una zona teoricamente visibile da tutto il processo.

Tuttavia gli strumenti per accedere a quelle zone di memoria possono essere definiti localmente, vedi i puntatori.

Potresti avere situazioni in cui perdendoti un puntatore non riesci più accedere all'area di memoria, pur essendo dal punto di vista teorico accessibile da tutto il processo:


void func()
{
char* buffer = malloc( ... ); // alloco nell'heap

return;
/* esco dalla funzione,
sto perdendo il riferimento perché
il puntatore è nello stack della funzione
stessa
*/
}

int main(void)
{
func();

getchar();
return 0;
}


In questo caso si parla di memory leak, perché non hai modo durante l'esecuzione del programma di liberare la memoria con la free().

Dopodiché, in teoria quando un programma termina il SO marca le aree utilizzate come disponibili per altri processi.