Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Problema malloc: dopo un tot di iterazioni fa un po quello che le pare!
Forum - C/C++ - Problema malloc: dopo un tot di iterazioni fa un po quello che le pare!

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
ingMark (Ex-Member)
Pro


Messaggi: 176
Iscritto: 19/07/2009

Segnala al moderatore
Postato alle 12:24
Giovedì, 23/07/2009
ciao a tutti :k:

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#

  1. void inserisci_nella_lista(tipo_parikh **p_punttesta, char parola[],
  2.                                                 char vett_parikh[], int occorrenze[], int lung_vett)
  3. {
  4. tipo_parikh *puntcor = NULL, *puntaux;
  5. tipo_anagramma *an_aux, *an_cor;
  6. int indice;
  7.  
  8. if(!presente_in_memoria(vett_parikh, *p_punttesta, occorrenze,
  9.                                                                                                         lung_vett, &puntcor))
  10. {
  11.  
  12.         if((puntaux = (tipo_parikh *) malloc(sizeof(tipo_parikh))) == NULL)
  13.                 getchar(); /*quando inizia a non allocare fermo il programma*/
  14.         /*
  15.          per isolare il problema ho provvisoriamente dichiarato statici i vettori
  16.          all'interno della struct
  17.  
  18.         (*puntaux).parola = (char *) malloc((lung_vett+1) * sizeof(char));
  19.         (*puntaux).occorrenze = (int *) malloc(lung_vett * sizeof(int));
  20.         */
  21.         strcpy((*puntaux).parola, vett_parikh);
  22.  
  23.         for(indice = 0; indice < lung_vett; indice++)
  24.                 (*puntaux).occorrenze[indice] = occorrenze[indice];
  25.         (*puntaux).testa = NULL;
  26.  
  27.         (*puntaux).prossimo = *p_punttesta;
  28.         *p_punttesta = puntaux;
  29.         puntcor = *p_punttesta;
  30. }
  31.  
  32. an_aux = (tipo_anagramma *) malloc(sizeof(tipo_anagramma)); /*anche qui smette di funzionare*/
  33.  
  34. /*
  35. come prima ho provvisoriamente dichiarato statico il vettore
  36.  
  37. (*an_aux).parola = (char *) malloc((strlen(parola)+1) * sizeof(char));
  38. */
  39. strcpy((*an_aux).parola, parola);
  40.  
  41. (*an_aux).prossimo = (*puntcor).testa;
  42. (*puntcor).testa = an_aux;
  43.  
  44. printf("%s -> ", (*puntcor).parola);  /*stampo a schermo per rendermi conto di quello che c'è nella lista*/
  45. an_cor = (*puntcor).testa;
  46. while(an_cor != NULL)
  47. {
  48.         printf("%s -> ", (*an_cor).parola);
  49.         an_cor = (*an_cor).prossimo;
  50. }
  51. printf("\n");
  52. for(indice = 0; indice < lung_vett; indice++)
  53.         printf("%d", (*puntcor).occorrenze[indice]);
  54. printf("\n\n");
  55. }/*END INSERISCI_NELLA_LISTA*/



Grazie per le risposte, io non so più dove sbattere la testa :alert:

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
PM Quote
Avatar
manvb.net (Member)
Guru


Messaggi: 663
Iscritto: 28/01/2008

Segnala al moderatore
Postato alle 13:24
Venerdì, 24/07/2009
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.

PM Quote
Avatar
ingMark (Ex-Member)
Pro


Messaggi: 176
Iscritto: 19/07/2009

Segnala al moderatore
Postato alle 19:57
Venerdì, 24/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 :-o

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 10:19
Sabato, 25/07/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 ...

PM Quote
Avatar
ingMark (Ex-Member)
Pro


Messaggi: 176
Iscritto: 19/07/2009

Segnala al moderatore
Postato alle 21:01
Domenica, 26/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:(

PM Quote
Avatar
ingMark (Ex-Member)
Pro


Messaggi: 176
Iscritto: 19/07/2009

Segnala al moderatore
Postato alle 18:36
Martedì, 28/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++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define MAX 30
  6.  
  7. typedef struct parola_s
  8. {
  9.         char *parola;
  10.         struct parola_s *prossimo;
  11. } tipo_parola;
  12.  
  13. main()
  14. {
  15. FILE *file_in;
  16. tipo_parola *punttesta = NULL, *puntaux;
  17. char par_letta[MAX+1];
  18. int num_cicli = 0, lung_parola;
  19.  
  20. if((file_in = fopen("ita.a", "r")) != NULL)
  21. {
  22.         while(fscanf(file_in ,"%s", par_letta) != EOF)
  23.         {
  24.                 lung_parola = strlen(par_letta)+1;
  25.                 puntaux = (tipo_parola *) malloc(sizeof(tipo_parola));
  26.                 if(puntaux != NULL)
  27.                 {
  28.                         (*puntaux).parola = (char *) malloc(lung_parola * sizeof(char));
  29.                         if((*puntaux).parola != NULL)
  30.                         {
  31.                                 strcpy((*puntaux).parola, par_letta);
  32.                                 (*puntaux).prossimo = punttesta;
  33.                                 punttesta = puntaux;
  34.  
  35.                                 printf("%s\n", (*puntaux).parola);
  36.                                 num_cicli++;
  37.                         }
  38.                         else
  39.                                 printf("Spazio non allocato per (*puntaux).parola\n");
  40.                 }
  41.                 else
  42.                 {
  43.                         printf("Spazio non allocato per puntaux\n");
  44.                 }
  45.         }
  46. }
  47. else
  48.         printf("File non aperto\n")
  49.  
  50. printf("%d", num_cicli);
  51. }



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
PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 20:23
Martedì, 28/07/2009
Ho provato il codice con un file di piu' di 303000 parole e non ho avuto problemi (Visual C++ 2003)

PM Quote
Avatar
ingMark (Ex-Member)
Pro


Messaggi: 176
Iscritto: 19/07/2009

Segnala al moderatore
Postato alle 22:07
Martedì, 28/07/2009
grazie per la disponibilità ;)
provero con il visual studio :k:

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 :(

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 22:08
Martedì, 28/07/2009
Ma hai lavorato con un compilatore a 16 bit?

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo