Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2004
    Messaggi
    118

    [C] liberare memoria da char **

    Ragazzi ho cercato dappertutto ma nn riesco a trovare la soluzione.
    Ho un
    codice:
    char **temp; //si capisce che deve essere una cosa temporanea
    alloco etc....
    bla bla
    ....
    Faccio le mie belle operazioni con temp
    Finito vorrei liberare la memoria di temp. Mi è venuto un dubbio devo fare solamente
    codice:
    free(temp);
    oppure devo fare riga per riga con un for??? Mi fate un esempio.

    Grazie e ciao

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Un esempio di che? Dipende tutto da cosa ci hai fatto con quel doppio puntatore ... come hai allocato lo spazio ?

  3. #3

    Re: [C] liberare memoria da char **

    Originariamente inviato da conqueror
    ...
    oppure devo fare riga per riga con un for???
    ...
    La seconda che hai detto
    E poi aggiungi
    codice:
    free(temp);
    temp = NULL;
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  4. #4
    codice:
    char **temp = NULL;
    int nRighe = 3;
    int nLen = 64; // Max 63 caratteri per stringa
    
    // Allochiamo
    // temp = (char**)malloc(nRighe * sizeof(char*));  // Scorretto
    temp = (char**)malloc(nRighe * sizeof(char));  // grazie a Oregon, abbiamo la versione corretta
    
    for ( int y = 0; y < nRighe; y++ )
        temp[y] = (char*)malloc(nLen * sizeof(char*));
    
    strcpy(temp[0], "Stringa 1\n");
    strcpy(temp[1], "Stringa 2\n");
    strcpy(temp[2], "Stringa 3\n");
    
    for(int x = 0; x < nRighe; x++)
        printf("%s\n", temp[x]);
    
    // Deallochiamo
    for (int k = 0; k < nRighe; k++)
        free(temp[k]);
    free(temp);
    temp = NULL;

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Questa linea

    codice:
    temp[y] = (char*)malloc(nLen * sizeof(char*));
    dovrebbe essere

    codice:
    temp[y] = (char*)malloc(nLen * sizeof(char));
    ... in ogni caso, questo potrebbe essere un esempio di come allocare memoria a partire dal doppio puntatore, ma il puntatore doppio potrebbe essere sfruttato anche diversamente ...

    Insomma, quello che si fa con la free dipende strettamente da come si usa la malloc ... quindi, rinnovo l'invito all'autore del thread a far vedere come usa la malloc per dare un suggerimento preciso sulla free ...

  6. #6
    si Oregon, è vero.

    Chiedo scusa per la svista

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2004
    Messaggi
    118
    Ecco:
    codice:
    char **temp;
    	temp = (char **)malloc(ROW*sizeof(char * )); //Perchè dovrebbe essere sizeof(char) ?????
    	register int i=0;
    	for (i=0;i<ROW; i++)
    	{
    		*(temp+i) = (char *)malloc(CLM*sizeof(char)+1);
    	}
    	*(temp+0) = "casa";
    	*(temp+1) = "postino";
    	*(temp+2) = "sasso";
    	*(temp+3) = "osteria";
    	*(temp+4) = "salvia";
    	*(temp+5) = "notare";
    	*(temp+6) = "renna"; // Non fate caso ai nomi, è un esercizio

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    @Vincenzo ... la malloc da correggere era la seconda, non la prima ...

    @conqueror ... l'allocazione che hai scritto e' corretta ... l'assegnazione delle stringhe e' sbagliata ... devi scrivere

    strcpy(temp[0], "casa");

    e cosi' via ...

    Per la free, va bene quello che ti e' stato suggerito ... prima la for con le free delle varie stringhe e poi la free per il doppio puntatore ...

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2004
    Messaggi
    118
    grazie mille a tutti.
    Ciao

  10. #10
    Originariamente inviato da oregon
    @Vincenzo ... la malloc da correggere era la seconda, non la prima ...


    La versione corretta, come suggerito da Oregon:
    codice:
    char **temp = NULL;
    int nRighe = 3;
    int nLen = 64; // Max 63 caratteri per stringa
    
    // Allochiamo
    temp = (char**)malloc(nRighe * sizeof(char*));
    for ( int y = 0; y < nRighe; y++ )
        temp[y] = (char*)malloc(nLen * sizeof(char));
    
    strcpy(temp[0], "Stringa 1\n");
    strcpy(temp[1], "Stringa 2\n");
    strcpy(temp[2], "Stringa 3\n");
    
    for(int x = 0; x < nRighe; x++)
        printf("%s\n", temp[x]);
    
    // Deallochiamo
    for (int k = 0; k < nRighe; k++)
        free(temp[k]);
    free(temp);
    temp = NULL;
    Stranamente però, funziona anche così:
    codice:
    // Allochiamo
    temp = (char**)malloc(nRighe * sizeof(char)); 
    for ( int y = 0; y < nRighe; y++ )
        temp[y] = (char*)malloc(nLen * sizeof(char));
    Mah!

    Attenzione: il fatto che funzioni non vuol dire che va bene usare "sizeof(char)" per la prima riga. Usate la varsione suggerita da oregon.

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.