|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
[C] Funzione free
Ho scritto questo semplice programmino che alloca dinamicamente un array con calloc, poi lo riempie e infine dovrebbe liberare la memoria precedentemente allocata con free ma quest'ultimo punto mi crea qualche problema....come mai non mi libera la memoria?
#include <stdlib.h> #include <stdio.h> /* Non riceve alcun parametro ed emette un puntatore a float */ int * get_mem(void); int main(void){ int i; int *puntatore; // Puntatore al primo valore float dell'array allocato /* Alloca la memoria dinamicamente e metti il valore del puntatore uscente dalla funzione get_mem nellaa variabile puntatore */ puntatore = get_mem(); printf("\nValore contenuto in puntatore: %p\n\n\n\n", puntatore); for(i=0; i<100; i++){ *(puntatore + i) = i; // Inizializza l'array con il valore di i } /* Visualizza l'array allocato dinamicamente */ for(i=0; i<100; i++){ printf("Indirizzo: %p Valore: %d\n", &puntatore[i],puntatore[i]); } printf("\n\n\n\n\nValore contenuto in puntatore: %p\n\n\n\n", puntatore); /* Libera la memoria precendetemente allocata */ for(i=0; i<100; i++) free(puntatore[i]); printf("%d", puntatore[2]); system("PAUSE"); return 0; } /* La funzione get_mem non riceve alcun parametro in ingresso e restituisce un puntatore al primo valore di tipo float dell'array di 100 elementi allocato dinamicamente */ int *get_mem(void){ int *p; // Puntatore al primo elemento di tipo float dell'array /* Alloca memoria per un array di 100 elementi di tipo float */ p = calloc(100, sizeof(int)); if(!p){ // Se calloc restituisce un puntatore NULL printf("Errore di allocazione della memoria\n"); exit(1); } return p; } |
![]() |
![]() |
![]() |
#2 |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Non vorrei sbagliare, ma quando usi malloc e calloc devi sempre convertire a puntatore al tipo che vuoi.
Prova a usare questa: Codice:
int *get_mem(void) { int *p; p = (int*)calloc(100*sizeof(int)); if (p==NULL) exit(1); return p; } Codice:
int *get_mem(void) { void *p; p = calloc(100*sizeof(int)); if (p==NULL) exit(1); return (int*)p; }
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
prima di tutto la sintassi è sbagliata.
A free() devi passare un puntatore , non un dato. facendo "free(puntatore[i]);" passi il valore contenuto in "puntatore[i]" alla funzione free() che cercherà di liberare la memoria all' indirizzo di memoria indicato da puntatore[i] (e quindi 1, 2, 3 , 4 , 5 ,6 ... strano che non ti sia andato in segmentation fault) . per liberare tutto l'array è sufficiente dare "free(puntatore);" e dovrebbe andare. In ogni caso c'è la possibilità che i valori rimangano in memoria e che quindi visualizzi ugualmente il valore. Infatti free() non cancella la memoria, semplicemente la rende disponibile per un altro programma che ne abbia necessità. Comunque accedere a una locazione di memoria non allocata come fai nella riga : printf("%d", puntatore[2]); a seconda del sistema operativo potrebbe portare a un segmentation fault. Ciao Ciao
__________________
GPU Compiler Engineer |
![]() |
![]() |
![]() |
#4 | |
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
Quote:
mmm grazie...ora provo...la cosa strana è che sul McGrowHill faceva come avevo scritto io...poi vi posto il suo esempio ![]() |
|
![]() |
![]() |
![]() |
#5 |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Ancora un altro paio di cose:
Codice:
free(puntatore[i]); Il compilatore ti dovrebbe dare quantomeno un warning. Devi chiamare direttamente: Codice:
free(puntatore); Solo che, a quel punto, la chiamata a printf non sarebbe lecita in quanto fai riferimento a una zona della memoria che non è più allocata. EDIT: stavo scrivendo questo post quando AnonimoVeneziano ha inserito la sua replica...
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
![]() |
![]() |
![]() |
#6 | |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
![]() |
![]() |
![]() |
#7 |
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
perchè non è buono?io mi ci trovo bene...sicuramente meglio del daitel & daitle...che ha che non và?
|
![]() |
![]() |
![]() |
#8 | |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
L'articolo all'origine di tutto è questo. Anche su ACCU.org (Association of C and C++ Users) non lo trattano certo bene.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
Il deitel & deitel per me è un buon libro ![]() ![]()
__________________
GPU Compiler Engineer |
|
![]() |
![]() |
![]() |
#10 | |
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
Quote:
|
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
ma almeno ti dice le cose corrette e non ti scrive cose sbagliate
![]()
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:13.