Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C] "FREE" errore

    codice:
    char *Record;
    ...
    
    Record=(char*)malloc((unsigned int) LenRecord-2);
    fread(Record,(unsigned int) (LenRecord-2),1,fpi);
    		
    ByteTLE=(unsigned char) Record[6];
    Chiave=(char*)malloc(ByteTLE-4+1);
    for(i=10;i<(10+ByteTLE-4);i++)
    	Chiave[i-10]= G_Table_EBCDIC_ASCII [(unsigned char) Record[i]];
    Chiave[i-10]='\0';
    ByteTLEValore=(unsigned char) Record[ByteTLE+6];
    Valore=(char*)malloc(ByteTLEValore+1);
    for(i=ByteTLE+10;i<ByteTLE+10+ByteTLEValore-4;i++)
    	Valore[i-(ByteTLE+10)]= G_Table_EBCDIC_ASCII [(unsigned char) Record[i]];
    Valore[i-(ByteTLE+10)]='\0';
    			
    strcpy(StrApp,Chiave);
    strcat(StrApp,"=");
    fwrite(StrApp,strlen(StrApp),1,fpo_tle);
    strcpy(StrApp,Valore);
    strcat(StrApp,"#");
    fwrite(StrApp,strlen(StrApp),1,fpo_tle);
    
    free(Record);
    si impianta sull'ultima istruzione...
    perchè non riesco ad effettuare la Free?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    "Si impianta" non vuol dire molto ...

    Quale errore hai esattamente?

    Hai controllato se il puntatore Record e' valido?

    Hai fatto un po' di debugging?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    il programma viene compilato.
    In debug sembra tutto ok, "Chiave" e "Valore" contengono i dati che mi aspettavo. Questi dati li prende da Record.
    In effetti qualcosa che non torna c'è:
    Record contiene (o meglio punta) tanti caratteri (gli stessi che vengono correttamente copiati nelle due variabili Chiave e Valore), ma nella finestra di debug non vedo il contenuto...

    L'errore è "DAMAGE:" after normal block (#2286) at....

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quindi la free, in debug, si accorge che il blocco e' stato "sporcato" da scritture di dati che hanno superato il blocco stesso.

    Devi quindi controllare, riga per riga, quello che c'e' tra la malloc e la free perche' il problema e' in quelle righe.

    Mi lascia perplesso il fatto che tu allochi memoria con

    LenRecord-2

    e poi usi i dati nell'array a partire da

    i=10

    senza controllare effettivamente se questo valore va oltre quello allocato ... insomma, ci sono parecchi punti che possono causare il problema.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    ho fatto una prova...

    se commento le istruzioni
    codice:
    /*
    strcpy(StrApp,Chiave);
    strcat(StrApp,"=");
    fwrite(StrApp,strlen(StrApp),1,fpo_tle);
    strcpy(StrApp,Valore);
    strcat(StrApp,"#");
    fwrite(StrApp,strlen(StrApp),1,fpo_tle);
    */
    non si blocca più.
    Non è che non allocando uno spazio ad StrApp tramite strcpye strcat vado a sovrappormi allo spazio allocato a Record?

  6. #6
    scusa, stavamo scrivendo tutti e due.

    alloco LenRecord byte ma salto i primi 10 perchè non mi servono.

    Comunque il tuo ragionamento è giusto... provo ad usare StrApp diversamente.

    Mi rimane un dubbio... strcpy e strcat non dovrebbero allocare automaticamente dello spazio libero???

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Luciano79
    Mi rimane un dubbio... strcpy e strcat non dovrebbero allocare automaticamente dello spazio libero???
    No ... affatto.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Originariamente inviato da oregon
    No ... affatto.
    Grazie!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.