[C] errore malloc()?

di il
23 risposte

23 Risposte - Pagina 2

  • Re: [C] errore malloc()?

    Vista la versione con il ciclo che ho postato prima mi ha fatto pensare ed ho fatto qualche prova.. gli errori venivano solo quando inserivo parole che dovevano essere convertite.. per cui è probabile che l'overflow sia un errore presente solo nella funzione Replace..

    dopo qualche tentativo, ho provato ad aumentare di un bit solo la realloc e sembra funzionare.. sono all'università ora e qui ho solo una versione base del programma. quando arrivo a casa ci provo e le faccio risapere..
  • Re: [C] errore malloc()?

    La funzione realloc puo' muovere il blocco di memoria in un'altra locazione.
    Dovresti usare una reference al puntatore riassegnandolo al vecchio.

    Se devi ridurre un testo non hai bisogno della realloc, mantieni la stessa allocazione originale.
    la replace potrebbe essere semplificata in qualcosa tipo:
    
    int Replace(char *orig, char *old, char *new)
    {
      int l_orig=strlen(orig);
      int l_diff=strlen(old)-strlen(new);
      
      char *tmp;
    
      if (l_diff>0)
      {
        while((tmp = strstr(orig, old)) != NULL) 
        {
          strncpy (tmp, new, strlen(new));
          tmp+=strlen(new);
          memmove (tmp,tmp+l_diff,l_orig-((tmp-orig)-l_diff));
        }
      }
    
      return 0;
    }
    
    Se proprio sei pignolo... nel main alla fine di tutte le tue chiamate usa li la realloc.
    Se il problema fosse inverso avrebbe un senso riallocare all'interno .

    Perche non mi hai risposto alle domande di ieri?
  • Re: [C] errore malloc()?

    Intendi queste?

    ixamit ha scritto:


    Perchè tutte quelle dichiarazioni nel main? A che cosa ti serve file txt?
    Poi, vuoi allocare dinamicamente (heap) o automaticamente (stack)?

    A te serve:
    1 buffer in input
    1 buffer in output
    oppure
    stesso buffer input/output
    ho risposto. solo che laconversazione si è allungata molto ed è stata divisa in 2 pagine, la risposta è sulla pagina precedente.


    cmq grazie!! ora provo a modificare la funzione Replace
  • Re: [C] errore malloc()?

    Ma la funzione che hai proposto non dovrebbe restituire il ris?
  • Re: [C] errore malloc()?

    Inutile.. non riesco a venirne a capo
  • Re: [C] errore malloc()?

    Non ritorna ris modifica direttamente il buffer passato come argomemto.
  • Re: [C] errore malloc()?

    Ho inviato il programma questa mattina alle 3 .. alla fine sono tornato ad usare un ciclo per le conversioni. così uso una parola per volta e non c'è quindi rischio di overflow. ho provato a modificare la funzione Replace ma continuava a dare errori quindi, per mancanza di tempo sono tornato alla funzione iniziale.
    comunque, ecco la soluzione finale:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAX 600
    
    char * Replace(char *origin, char *old, char *new)
    {
      char *sms_out = (char*)malloc(sizeof(char)*strlen(origin));
      char *tmp = (char*)malloc(sizeof(char)*strlen(origin));
      sms_out = strcpy(sms_out, origin);
     
      char *pos;
    
      while((pos = strstr(sms_out, old)) != NULL) 
      {
        memset(tmp, 0, strlen(tmp));
      
        tmp = strncpy(tmp,sms_out, pos - sms_out);
        
        tmp = strcat(tmp, new);
        
        tmp = strcat(tmp, pos + strlen(old));
        
        sms_out = strcpy(sms_out, tmp);
      
       }
    
      free(tmp);
      free(origin);
      sms_out = (char*)realloc(sms_out, sizeof(char)*strlen(sms_out));
    
     return sms_out;
    
    }
    
    
    int main(int argc, char ** argv) 
    {
      char sms_in[MAX];
      char *mystring, *sms_out;
      FILE *fp, *fr;
      
    
      remove("sms_in.txt");
      remove("sms_out.txt");
    
      printf("Inserire il testo da convertire e premere invio:\n");
      
      do{ 
          scanf("%s", sms_in);
         
          fp = fopen("sms_in.txt", "a");
          
          if (fp == NULL) 
          {
            printf("Errore nell'apertura del file.\n");
            return 1;
          }
        
           fprintf(fp, "%s ", sms_in); 
           rewind(fp);
     
    
          mystring = (char*)malloc(sizeof(char) * strlen(sms_in)+1);
          mystring = strcpy(mystring,sms_in);
    
    	      #include "comprsms.h"
          
          printf("%s ",sms_out);
          
                fr = fopen("sms_out.txt", "a");
          
          if (fr == NULL) 
          {
            printf("Errore nell'apertura del file.\n");
            return 1;
          }
           fprintf(fr, "%s ", sms_out); 
           rewind(fr);
          
        }while(getchar() != '\n');
    
      printf("\n");
      fflush(fp);
      fflush(fr);
      fclose(fp);
      fclose(fr);
     
     exit(0);
      
    }
    
    il file comprsms.h contiene le conversioni:
      sms_out = Replace(mystring, "ch", "k");
      sms_out = Replace(sms_out, "per", "x");
      sms_out = Replace(sms_out, "come", "cm");
      sms_out = Replace(sms_out, "questo", "qst");
      sms_out = Replace(sms_out, "niente", "nnt");
      sms_out = Replace(sms_out, "non", "nn");
      sms_out = Replace(sms_out, "oggi", "gg");
      sms_out = Replace(sms_out, "uno", "1");
      sms_out = Replace(sms_out, "sono", "sn");
      sms_out = Replace(sms_out, "tutto", "tt");
      sms_out = Replace(sms_out, "tutta", "tt");
      sms_out = Replace(sms_out, "cosa", "cs");
      sms_out = Replace(sms_out, "una", "1");
      sms_out = Replace(sms_out, "comunque", "cmq");
      sms_out = Replace(sms_out, "bene", "bn");
      sms_out = Replace(sms_out, "sei", "6");
      sms_out = Replace(sms_out, "destra", "dx");
      sms_out = Replace(sms_out, "sinistra", "sx");
      sms_out = Replace(sms_out, "numero", "num");
      sms_out = Replace(sms_out, "dopo", "dp");
      sms_out = Replace(sms_out, "sms_outpondi", "sms_outp");
      sms_out = Replace(sms_out, "sms_outponde", "sms_outp");
    
      sms_out = Replace(sms_out, "Ch", "K");
      sms_out = Replace(sms_out, "Per", "X");
      sms_out = Replace(sms_out, "Come", "Cm");
      sms_out = Replace(sms_out, "Questo", "Qst");
      sms_out = Replace(sms_out, "Niente", "Nnt");
      sms_out = Replace(sms_out, "Non", "Nn");
      sms_out = Replace(sms_out, "Oggi", "Gg");
      sms_out = Replace(sms_out, "Uno", "1");
      sms_out = Replace(sms_out, "Sono", "Sn");
      sms_out = Replace(sms_out, "Tutto", "Tt");
      sms_out = Replace(sms_out, "Cosa", "Cs");
      sms_out = Replace(sms_out, "Una", "1");
      sms_out = Replace(sms_out, "Comunque", "Cmq");
      sms_out = Replace(sms_out, "Bene", "Bn");
      sms_out = Replace(sms_out, "Sei", "6");
      sms_out = Replace(sms_out, "Destra", "Dx");
      sms_out = Replace(sms_out, "Sinistra", "Sx");
      sms_out = Replace(sms_out, "Numero", "Num");
      sms_out = Replace(sms_out, "Dopo", "Dp");
      sms_out = Replace(sms_out, "sms_outpondi", "sms_outp");
      sms_out = Replace(sms_out, "sms_outponde", "sms_outp");
    
      sms_out = Replace(sms_out, "CH", "K");
      sms_out = Replace(sms_out, "PER", "X");
      sms_out = Replace(sms_out, "COME", "CM");
      sms_out = Replace(sms_out, "QUESTO", "QST");
      sms_out = Replace(sms_out, "NIENTE", "NNT");
      sms_out = Replace(sms_out, "NON", "NN");
      sms_out = Replace(sms_out, "OGGI", "GG");
      sms_out = Replace(sms_out, "UNO", "1");
      sms_out = Replace(sms_out, "SONO", "SN");
      sms_out = Replace(sms_out, "TUTTO", "TT");
      sms_out = Replace(sms_out, "COSA", "CS");
      sms_out = Replace(sms_out, "UNA", "1");
      sms_out = Replace(sms_out, "COMUNQUE", "CMQ");
      sms_out = Replace(sms_out, "BENE", "BN");
      sms_out = Replace(sms_out, "SEI", "6");
      sms_out = Replace(sms_out, "DESTRA", "DX");
      sms_out = Replace(sms_out, "SINISTRA", "SX");
      sms_out = Replace(sms_out, "NUMERO", "NUM");
      sms_out = Replace(sms_out, "DOPO", "DP");
      sms_out = Replace(sms_out, "sms_outPONDI", "sms_outP");
      sms_out = Replace(sms_out, "sms_outPONDE", "sms_outP");
    sono 64 in tutto. e nei file sms_in.txt ed sms_out.txt salvo il testo originale e quello compresso.
    volevo evitare il ciclo ma alla fine, forse è la soluzione migliore..
    grazie comunque per l'aiuto
  • Re: [C] errore malloc()?

    Dovresti ascoltare i consigli. Quello che a te funziona NON funziona (bene)
    
    ==11420== Invalid write of size 1                                          
    ==11420==    at 0x4C252CF: strcpy (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
    ==11420==    by 0x400B9B: Replace (in /home/max/a.out)                                      
    ==11420==    by 0x400DAC: main (in /home/max/a.out)                                         
    ==11420==  Address 0x5184314 is 0 bytes after a block of size 4 alloc'd                     
    ==11420==    at 0x4C241C3: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
    ==11420==    by 0x400B6C: Replace (in /home/max/a.out)                                                                    
    ==11420==    by 0x400DAC: main (in /home/max/a.out)                                                                       
    ==11420==                                                                                                                 
    ==11420== Invalid read of size 1                                                                                          
    ==11420==    at 0x4C24EE4: index (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)                               
    ==11420==    by 0x4EA6139: strstr (strstr.c:68)                                                                           
    ==11420==    by 0x400C57: Replace (in /home/max/a.out)                                                                    
    ==11420==    by 0x400DAC: main (in /home/max/a.out)                                                                       
    ==11420==  Address 0x5184314 is 0 bytes after a block of size 4 alloc'd                                                   
    ==11420==    at 0x4C241C3: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)                              
    ==11420==    by 0x400B6C: Replace (in /home/max/a.out)                                                                    
    ==11420==    by 0x400DAC: main (in /home/max/a.out)                                                                       
    ==11420==                                                                                                                 
    ==11420== Invalid read of size 1                                                                                          
    ==11420==    at 0x4C25254: strlen (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)                              
    ==11420==    by 0x400C8A: Replace (in /home/max/a.out)                                                                    
    ==11420==    by 0x400DAC: main (in /home/max/a.out)                                                                       
    ==11420==  Address 0x5184314 is 0 bytes after a block of size 4 alloc'd                                                   
    ==11420==    at 0x4C241C3: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)                              
    ==11420==    by 0x400B6C: Replace (in /home/max/a.out)                                                                    
    ==11420==    by 0x400DAC: main (in /home/max/a.out)                                                                       
    ==11420==                                                                                                                 
    ==11420== Invalid read of size 1                                                                                          
    ==11420==    at 0x4C25254: strlen (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)                              
    ==11420==    by 0x400B64: Replace (in /home/max/a.out)                                                                    
    ==11420==    by 0x400DC6: main (in /home/max/a.out)                                                                       
    ==11420==  Address 0x51843b4 is 0 bytes after a block of size 4 alloc'd                                                   
    ==11420==    at 0x4C242BD: realloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)                             
    ==11420==    by 0x400C9C: Replace (in /home/max/a.out)                                                                    
    ==11420==    by 0x400DAC: main (in /home/max/a.out)                                                                       
    --- cut ---
    
    Saluti,
    Max
  • Re: [C] errore malloc()?

    Ma li ascolto! è solo che non ci arrivo
    ero a corto con i tempi quindi mi sono inventato quella soluzione lì... ma il programma pian piano lo riguardo cmq! se ci capisco qualcosa vi faccio sapere..
Devi accedere o registrarti per scrivere nel forum
23 risposte