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?
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?
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.
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...
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.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.