Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Malloc
Forum - C/C++ - Malloc

Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 11:43
Mercoledì, 24/03/2010
Innanzi a tutto volevo chiedervi se è corretta la seguente riga per allocare dinamnicamente array di i + 1 stringhe

Codice sorgente - presumibilmente Plain Text

  1. char** strArr = (char**)malloc(sizeof(char*) * (i + 1));



Seccome volevo utilizzare l'ultimo elemento dell'array come indicatore di fine array mi chiedevo: la malloc inizializza i punatori successivi al primo a zero, ossia strArr + 1, strArr + 2, etc... sono = a 0?

Ultima modifica effettuata da robrock80 il 24/03/2010 alle 11:45
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 12:58
Mercoledì, 24/03/2010
in questo modo allochi lo spazio per i puntatori alle stringhe. Ti occorre una nuova malloc per ogni puntatore per allocare lo spazio delle stringhe vere e proprie.

Ad ogni modo malloc non inizializza nulla... usa calloc per allocare e settare un intero array a zero: http://www.cplusplus.com/reference/clibrary/cstdlib/calloc/

ciao ;)

PM Quote
Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 13:03
Mercoledì, 24/03/2010
Ok, ti ringrazio... Per deallocarlo ho scritto invece il seguente codice

Codice sorgente - presumibilmente C/C++

  1. void freeCharMatrix(char** toFree) {
  2.         int i = 0;
  3.         for (; *(toFree + i) != 0; i++) {
  4.                 //printf("%d\n", i );
  5.                 free(*(toFree + i));
  6.         }
  7.         free(*(toFree + (i + 1)));
  8.         free(toFree);
  9. }



Va bene?

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 13:12
Mercoledì, 24/03/2010
Testo quotato

Postato originariamente da robrock80:

Ok, ti ringrazio... Per deallocarlo ho scritto invece il seguente codice

Codice sorgente - presumibilmente C/C++

  1. void freeCharMatrix(char** toFree) {
  2.         int i = 0;
  3.         for (; *(toFree + i) != 0; i++) {
  4.                 //printf("%d\n", i );
  5.                 free(*(toFree + i));
  6.         }
  7.         free(*(toFree + (i + 1)));
  8.         free(toFree);
  9. }



Va bene?



va quasi bene (leggi il "PS" nel codice) se hai fatto una malloc/calloc per ogni stringa, ma io lo aggiusterei un po' così:

Codice sorgente - presumibilmente C#

  1. void freeCharMatrix_versionepulita_(char** toFree)
  2. {
  3.   if ( toFree ) // Evitiamo di dereferenziare possibili puntatori nulli
  4.   {
  5.     char *pCurrent = *toFree; // prendo il primo puntatore dell'array
  6.  
  7.     while ( pCurrent!= 0 ) // non creiamo espressioni condizionali illegibili, please!
  8.     {
  9.       free( pCurrent );
  10.       pCurrent++; // usiamo l'aritmetica dei puntatori per andare al successivo
  11.     }
  12.     // PS: l' (i+1)-esimo puntatore è NULL per definizione, quindi non posso deallocarlo!
  13.  
  14.     free( toFree );    
  15.   }
  16. }



Dimmi se ti garba la correzione ;)

PM Quote
Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 13:27
Mercoledì, 24/03/2010
Si, mi piace, si legge meglio. Però ho un dubbio sul PS: se io alloco "i + 1" anche se l'ultimo elemento lo lascio a 0, io devo comunque deallocarlo, altrimenti la CPU non libera quella parte di memoria, fino a che il processo non è chiuso, mi sbaglio?

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 13:31
Mercoledì, 24/03/2010
ti sbagli...

con una malloc/calloc, allochi l'array di puntatori a char di dimensione N+1.

Poi, dentro un ciclo for, allochi altri N array di char (le stringhe), mentre l'N+1-esimo elemento lo setti a 0 (quindi rimane allocato l'elemento, ma non punta a nessuna stringa).

quando deallochi, prima elimini le N stringhe, poi elimini l'array di N+1 puntatori. L'elemento N+1 non è mai stato occupato da un buffer allocato, quindi non devi deallocarlo per nessun motivo. Diciamo che facendo il free dell'array di N+1 elementi, se ne va anche la memoria occupata da quel puntatore nullo nella posizione N+1 (così come se ne vanno anche tutti i precedenti N puntatori).

PM Quote
Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 13:34
Mercoledì, 24/03/2010
ahhhhh... Ok, ok, ora capito... Grazie di nuovo:k:

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 13:35
Mercoledì, 24/03/2010
figurati ;)
comprendere appieno il meccanismo di gestione manuale della memoria in C non è facile :)

PM Quote