Newsgroup: it.comp.lang.c
Titolo: malloc e free

Ciao a tutti ho un problema credo banale ma che non riesco a risolvere.
int cardPRS=0;
int *occTK=NULL;
char ** locTK=NULL;
cardPRS=CountWordPRS(filename);
occTK=(int *)malloc(sizeof(int)*cardPRS);
locTK=(char **)malloc(1*cardPRS);
alloco memoria in questo modo.. la funzione CountWordPRS mi ritorna un
numero intero.
poi utilizzo occTK e locTK e tutto va bene.
per liberarla uso questa sintassi qua:
for (j=0; j<cardPRS;j++){
        free(locTK[j]);
}
free(locTK);
free(occTK);
lanciando il mio programma in debug il ciclo funziona e sembra liberare
memoria.. ma il problema è free(locTK), ed ho notato che comunque pure
free(occTK) mi dà lo stesso problema di access violation, come mai?
P.S. ho provato anche con la sintassi del c++ cioè new e delete ma pure
qua errori.
Grazie mille.
sara
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 
Con l'ultima malloc vuoi allocare un array di puntatori a char? Se si 
dovresti usare malloc(sizeof(char*)*cardPRS) dato che la dimensione di 
un char* non e' 1.
-- 
Devaraja (Xdevaraja87^gmail^c0mX)
Linux Registerd User #338167
http://counter.li.org

 
La prima, sempre che tu voglia allocare un array di puntatori a char.


 un char* non e' 1.
ma sarebbe
locTK=(char**)malloc(sizeof(char*)*cardPRS) 
oppure
locTK=(char*)malloc(sizeof(char*)*cardPRS)
?
grazie ancora


 La prima, sempre che tu voglia allocare un array di puntatori a char.
Si.. 
bè ora si pone un altro problema nell'utilizzo di locTK:
while(locTK[x]!=NULL && FoundTK!=1 ){ 
	if(!stricmp(dictionary[i],locTK[x])){
		FoundTK=1;
	}
	x++;
	i++;
}
ciclo locTK, ma quando esso arriva alla fine e invece di avere una parola
si trova una riga vuota non esce dal while ma fa la stricmp() e dà errore.
il controllo del locTK deve essere diverso? ho provato con 
while(locTK[x]!="" ....
ma nulla. che sarà mai?
:)
sara


> while(locTK[x]!=NULL && FoundTK!=1 ){ 
Forse:
while (*locTK[x] && FoundTK!=1)
{
   /* fa qualcosa */
};
-- 
Quando noi ignoranti eravamo di piů, tutto era piů bello...
(A. Celentano)
Per rispondermi in privato, prima togli l'immondizia dalla testa.

 
Perche' locTK[x] dovrebbe essere uguale a NULL? Nel codice che hai 
postato non inizializzi i puntatori dell'array a NULL. Quel controllo 
(locTK[x]!=NULL) nella condizione del while ti serve solo a scorrere 
l'array, vero? E ti vuoi fermare quando FoundTK!=1 vero?


 };
esatto.. 
ti ho scritto anche in privato se puoi aiutarmi..


 l'array, vero? E ti vuoi fermare quando FoundTK!=1 vero?
mi serve sia per scorrere locTK sia per fermarlo quando non ha più parole
da leggere.. perchè il while mi si può fermare sia quando trova la parola
FoundTK=1 sia quando nn ha parole da leggere..
cmq se ti può essere migliore ho modificato il codice in questa maniera:
http://phpfi.com/70456
dove estractprs è richiamata all'interno di un'altra funzione che mi cicla
dei file.prs all'interno di una cartella e passandone uno alla volta ad
estractprs.
la funzione loadprs invece mi carica in locTK le parole contenute nel
file.prs e in occTK le relative occorrenze della parola nel file.
poi in base al risultato di foundTK salvo i dati in una struttura termini.
il problema di adesso è che in modalità debug va tutto quanto.. mi elabora
tutti i file e lo fa correttamente, quando lancio invece l'esecuzione vera
e propria mi si blocca al secondo file dandomi un errore di assertion sul
file dbgheap.c sull'espressione CrtIsValidHeapPointer(pUserData)
se puoi aiutarmi...
grazie mille


 
Nessun problema :-) comunque a me non e' arrivato niente, e credo che tu 
possa ottenere risultati migliori qui, dove ti possono rispondere anche 
gli altri.
d e varaj a 87 ::AT:: gma il, com


 sara
Qui si fa gia' piu' difficile, per ora la lascio agli esperti del ng :-) 
poi magari mi viene in mente qualcosa.


 poi magari mi viene in mente qualcosa.
bè che dire.. intanto grazie mille milioni.. e purtroppo non posso pastare
l'intero progetto compilabile perchè contiene file e librerie proprietarie
quindi se potete aiutarmi con questo poco vi sarei grata.
leggerò le vostre risposte (speriamo copiose :P ) domani.


 
-- 


 free(occTK) mi dà lo stesso problema di access violation, come mai?
Perché cerchi di deallocare memoria mai allocata ?
Dove hai allocato lockTK[0] e dove lockTK[1] e dove .... 
lockTK[cardPRS-1] ??

 locTK=(char**)malloc(sizeof(char*)*cardPRS) 
Questa, ma il cast č inutile:
locTK=calloc(cardPRS, sizeof(char*));

 quindi ti conviene usare un for
"while" e "for" vanno bene entrambi.

 ad 11 per locTK
Purtroppo non č cosě.  Quando si alloca memoria con malloc(), il 
contenuto allocato č normalmente "sporco", devi usare calloc() per avere 
invece questo effetto.  La chiamata a calloc() non č altro che una 
malloc() con una chiamata a memset() per impostare tutti i byte allocati 
a 0.

 trasformazione č inutile, a differenza del C++ in cui č obbligatoria.
Leggasi:
"In C questa trasformazione č *automatica*, a differenza del C++ in cui 
necessita di cast esplicito".