Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    168

    [C] Problema con calloc()

    Ho un problema! Ho sempre utilizzato la funzione calloc senza problemi, ma adesso mi si verifica un fatto strano. Provo a spiegarmi con un esempio:

    codice:
    char *n;
    char *m;
    
    n = calloc(strlen(j.campoDiUnaStruct), sizeof(char));
    strcat(n, j.campoDiUnaStruct);
    
    m = calloc(strlen(j.campoDiUnaStruct)+5, sizeof(char));
    ...
    Dove j è una struct.
    Il problema è che quando alloco la memoria per m, mi modifica il valore di n (ad esempio mi aggiunge un punto esclamativo alla fine di n)...
    Come è possibile?

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    E' più corretto usare strcpy di strcat. In ogni caso dovresti allocare strlen(s)+1 caratteri. Le stringhe sono infatti terminate dal carattere '\0'.
    Ad esempio "Ciao" <=> {'C', 'i', 'a', 'o', '\0'} => 5 caratteri
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    168
    Grazie mille, lo sapevo per il +1 ma me ne sono scordata!!!
    E grazie anche per strcpy in effetti hai ragione ovviamente

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    168
    Il problema iniziale è risolto!Adesso però ne ho un altro: quando alloco memoria con calloc dovrei alla fine liberarla, giusto?Anche in questo caso mi succede una cosa strana...per tutte le variabile che ho utilizzato allocando memoria con calloc sto usando la free(). Il problema è che, andando a guardare con il debug, alcune variabili me le azzera (nel senso che svuota il contenuto), altre le lascia invariate, in altre ancora mette caratteri strani tipo <<.
    Come è possibile?

  5. #5
    La free() rilascia la memoria allocata, ma non altera minimamente ne il valore del puntatore, ne il contenuto della memoria a cui puntava.
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Quote Originariamente inviata da Dany_ Visualizza il messaggio
    alcune variabili me le azzera (nel senso che svuota il contenuto), altre le lascia invariate, in altre ancora mette caratteri strani tipo <<
    L'equivoco è che credi che liberare memoria (con la free) significhi azzerare (o modificare) la memoria stessa. Non è così.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    168
    ah ecco... quindi il fatto che dopo che faccio la free, con il debug, vedo che la variabile ha ancora il contenuto non vuol dire nulla?Nel senso che la memoria è stata comunque liberata correttamente?

  8. #8
    È normale; con la free restituisci la memoria al gestore dell'heap, che si segna semplicemente in delle sue strutture dati che la memoria è ora nuovamente disponibile, e può dartela alla successiva malloc.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    168
    Grazie mille

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 © 2024 vBulletin Solutions, Inc. All rights reserved.