Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 12 su 12
  1. #11
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Ah già ho capito l' errore,grazie comunque per l' aiuto che sei stato utile dicendomi come usare la free.
    L' errore era nella funzione di inserimento,io non facevo ritornare il puntatore allocato,e il puntatore era sostanzialmente perso,lo allocavo ma andava ritornato.
    Ecco qua:
    codice:
    lista *insert(lista *ptr,int *num)
    {
        (*num)++;
        char *buffer;
        if((*num)==1)
        {
            ptr=(lista*)malloc(sizeof(lista));
            if(ptr==NULL)
                MERROR
        }
        else
        {
            ptr=(lista*)realloc(ptr,(*num)*sizeof(lista));
            if(ptr==NULL)
                MERROR
        }
        printf("Inserisci nome:-->");
        ptr[*num-1].nome=input();
        printf("Inserisci cognome:-->");
        ptr[*num-1].cognome=input();
        printf("Inserisci eta:-->");
        buffer=input();
        ptr[*num-1].eta=atoi(buffer);
        free(buffer);
        return ptr;
    }
    Grazie,ciao

  2. #12
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469

    Re: [C]Usare la free su array di strutture

    Originariamente inviato da ramy89
    Salve,se io alloco n strutture dinamicamente,e una strutture è composta così:
    codice:
    typedef struct
    {
        char *nome;
        char *cognome;
        int eta;
    }lista;
    E creo una lista chiamata stack che alloco dinamicamente:
    codice:
    lista *stack;
    E i campi nome e cognome li acquisisco allocando dinamicamente la memoria.
    Mi rimane sempre questo dubbio fondamentale:
    Alla fine devo liberare solo la lista in questo modo:
    codice:
    for(i=0;i<n;i++)
        free(stack[i]);
    Oppure devo liberare anche gli elementi nome e cognome,che ho allocato dinamicamente?
    Mi rimane sempre il dubbio,alla fine usando la free sulla struttura libero la struttura,ma cosa a proposito della memoria allocato all' interno dei suoi puntatori?Chiaritemi questo dubbio
    hai intuito correttamente.
    tutto quello che allochi "a mano" devi deallocare "a mano"
    nessuno sa cosa ci sia dentro "nome".
    char*nome non sono altro che 32 bit. la tua struttura occupa (su macchine a 32bit)
    6 byte (tralasciando l'eventuale padding)

    Quadruplo suggerimento (anche se vedo che per qualcuno sono "assiomi")

    1) inizializza sempre a zero i puntatori
    2) controlla sempre e comunque che una funzione di allocazione torni un puntatore valido. non è scontato che ciò accada sempre.
    3) prima di liberare della memoria controlla che il puntatore sia non null (valido)
    4) setta a zero un puntatore una volta deallocata la memoria. questa è una funzione che da decenni si pensa se introdurre nel C++ (delete), tagliando via la possibilità di usare lvalue "strani". Metodi alternativi sono l'uso di distruttori "intelligenti".
    In C, più modestamente, settalo a zero e buonanotte

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