ingMark (Ex-Member)
Pro
Messaggi: 176
Iscritto: 19/07/2009
|
ciao a tutti
ho la necessità di memorizzare un gran numero di parole che prendo da un file (e fin qui tutto ok) e metterle in una lista di liste.
Tutto procede perfettamente, ma ad un certo punto (dopo molte iterazioni) la malloc fallisce e restituisce sempre il valore NULL.
Ho provato con file più brevi e l'operazione va a buon fine, il problema non si verifica.
Ho effettuato il debug più e più volte, le operazioni precedenti vanno a buon fine, ma quando si tratta di copiare il risultato nella lista quest'operazione fallisce perchè la malloc ha restituito NULL.
Ho cercato nel forum argomenti simili ma ho trovato solo un post in cui si parlava di allocazioni maggiori di 2GB che non è proprio il mio caso visto che penso di non superare i 2mb in tutto.
Ecco lo spezzone di codice:
Codice sorgente - presumibilmente C# |
void inserisci_nella_lista(tipo_parikh **p_punttesta, char parola[], char vett_parikh[], int occorrenze[], int lung_vett) { tipo_parikh *puntcor = NULL, *puntaux; tipo_anagramma *an_aux, *an_cor; int indice; if(!presente_in_memoria(vett_parikh, *p_punttesta, occorrenze, lung_vett, &puntcor)) { if((puntaux = (tipo_parikh *) malloc (sizeof(tipo_parikh ))) == NULL) getchar(); /*quando inizia a non allocare fermo il programma*/ /* per isolare il problema ho provvisoriamente dichiarato statici i vettori all'interno della struct (*puntaux).parola = (char *) malloc((lung_vett+1) * sizeof(char)); (*puntaux).occorrenze = (int *) malloc(lung_vett * sizeof(int)); */ strcpy((*puntaux).parola, vett_parikh); for(indice = 0; indice < lung_vett; indice++) (*puntaux).occorrenze[indice] = occorrenze[indice]; (*puntaux).testa = NULL; (*puntaux).prossimo = *p_punttesta; *p_punttesta = puntaux; puntcor = *p_punttesta; } an_aux = (tipo_anagramma *) malloc (sizeof(tipo_anagramma )); /*anche qui smette di funzionare*/ /* come prima ho provvisoriamente dichiarato statico il vettore (*an_aux).parola = (char *) malloc((strlen(parola)+1) * sizeof(char)); */ strcpy((*an_aux).parola, parola); (*an_aux).prossimo = (*puntcor).testa; (*puntcor).testa = an_aux; printf("%s -> ", (*puntcor).parola); /*stampo a schermo per rendermi conto di quello che c'è nella lista*/ an_cor = (*puntcor).testa; while(an_cor != NULL) { printf("%s -> ", (*an_cor).parola); an_cor = (*an_cor).prossimo; } printf("\n"); for(indice = 0; indice < lung_vett; indice++) printf("%d", (*puntcor).occorrenze[indice]); printf("\n\n"); }/*END INSERISCI_NELLA_LISTA*/
|
Grazie per le risposte, io non so più dove sbattere la testa
EDIT: i NULL nel programma sono maiuscoli, non minuscoli come appaiono nel forum
Ultima modifica effettuata da ingMark il 23/07/2009 alle 12:25 |
|
manvb.net (Member)
Guru
Messaggi: 663
Iscritto: 28/01/2008
|
In genere malloc ritorna NULL quando non c'è abbastanza memoria disponibile per l'allocazione. Quando il programma si blocca (in modalità debug) non lo chiudere ma apri il taskmanager e nella scheda processi vedi quanta memoria ha allocato il tuo programma.
|
|
ingMark (Ex-Member)
Pro
Messaggi: 176
Iscritto: 19/07/2009
|
la memoria occupata è davvero poca
il task manager mi dice 2mb e qualcosa.
io ho 1gb di ram con winxp. sempre il task manager mi dice che più della memoria ram è ancora disponibile O.o
infatti non mi capacito di questa cosa
|
|
theprogrammer (Normal User)
Guru^2
Messaggi: 2509
Iscritto: 28/01/2009
|
E' possibile che, per un errore del programma, venga passato alla malloc un argomento non corretto (ad esempio, invece di 1000, viene passato un puntatore che ha sempre valori elevati e viene "confuso" per una richiesta di piu' giga).
E' fondamentale sapere il valore degli argomenti passati alla malloc quando questa fallisce ...
|
|
ingMark (Ex-Member)
Pro
Messaggi: 176
Iscritto: 19/07/2009
|
scusate il ritardo della risposta.
in ogni caso mettendo sotto watch il sizeof(tipo_parikh) il valore è sempre 95, che funzioni o meno
|
|
ingMark (Ex-Member)
Pro
Messaggi: 176
Iscritto: 19/07/2009
|
Scusate se riprendo un topic a cui non ci sono risposte da un po ma ancora ho lo stesso problema.
ho provato a fare una cosa più semplice!
Inserisco le parole lette da file in una lista semplicissima.
questo benedetto programma inserisce correttamente 2042 parole e poi inizia a non allocare più memoria!
giusto per completezza metto il codice
Codice sorgente - presumibilmente C++ |
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 30 typedef struct parola_s { char *parola; struct parola_s *prossimo; } tipo_parola; main() { FILE *file_in; tipo_parola *punttesta = NULL, *puntaux; char par_letta[MAX+1]; int num_cicli = 0, lung_parola; if((file_in = fopen("ita.a", "r")) != NULL) { while(fscanf(file_in ,"%s", par_letta) != EOF) { lung_parola = strlen(par_letta)+1; puntaux = (tipo_parola *) malloc(sizeof(tipo_parola)); if(puntaux != NULL) { (*puntaux).parola = (char *) malloc(lung_parola * sizeof(char)); if((*puntaux).parola != NULL) { strcpy((*puntaux).parola, par_letta); (*puntaux).prossimo = punttesta; punttesta = puntaux; printf("%s\n", (*puntaux).parola); num_cicli++; } else printf("Spazio non allocato per (*puntaux).parola\n"); } else { printf("Spazio non allocato per puntaux\n"); } } } else printf("File non aperto\n") printf("%d", num_cicli); }
|
Onestamente proprio non capisco!
La memoria non manca, il parametro della malloc è corretto.
ps. se può essere utile come informazione ho provato ad allocare un mega di spazio ((1024 *1024) * sizeof(char)) e non alloca! Penso che la malloc abbia limiti un po più alti.
Ultima modifica effettuata da ingMark il 28/07/2009 alle 19:34 |
|
theprogrammer (Normal User)
Guru^2
Messaggi: 2509
Iscritto: 28/01/2009
|
Ho provato il codice con un file di piu' di 303000 parole e non ho avuto problemi (Visual C++ 2003)
|
|
ingMark (Ex-Member)
Pro
Messaggi: 176
Iscritto: 19/07/2009
|
grazie per la disponibilità
provero con il visual studio
Io per il momento ho sempre usato il turbo c della borland per il suo debugger (che trovo semplice e fantastico).
Tuttavia avevo provato a compilare il programma anche con codeblocks senza risultati diversi
|
|
theprogrammer (Normal User)
Guru^2
Messaggi: 2509
Iscritto: 28/01/2009
|
Ma hai lavorato con un compilatore a 16 bit?
|
|