Newsgroup: it.comp.lang.c
Titolo: implementazione tipo matrice

Salve a tutti!
Allora, ho scritto un tipo matrice:
#define TYPE_MATRIX float
typedef struct {
     unsigned int rows;
     unsigned int cols;
     TYPE_MATRIX **innerMatrix;
} matrix;
matrix* AllocMatrix(unsigned int inRows, unsigned int inCols)
{
     int i;
     matrix *M = (matrix*)malloc(sizeof(matrix));
     M->innerMatrix = (TYPE_MATRIX**)malloc(sizeof(TYPE_MATRIX*)*inRows);
     for(i=0;i<inRows;i++)
         M->innerMatrix[i] = 
(TYPE_MATRIX*)malloc(sizeof(TYPE_MATRIX)*inCols);
     M->rows = inRows;
     M->cols = inCols;
     return M;
}
void cancella(matrix* M)
{
     int i;
     for(i=0;i<M->rows;i++)
         free(M->innerMatrix[i]);
     free(M->innerMatrix);
     free(M);
}
Ora, cancella() non cancella un bel niente, o quantomeno non lavora come 
mi aspetterei. infatti, se scrivo:
	matrix* myMatrix = AllocMatrix(5,3);
         myMatrix->innerMatrix[1][1]=4;
         cancella(myMatrix);
         printf("%.1f", myMatrix->innerMatrix[1][1]);
mi stampa 4. Cosa c'è che non va?
Grazie!
matteo

 mi stampa 4. Cosa c'è che non va?
assolutamente niente!
va tutto come dovrebbe andare.
il fatto di liberare un'area con la free non ti fa perdere il
valore del puntatore ed il suo contenuto, solamente la libera in
modo che un'altra malloc la possa utilizzare.
dato che tra la funzione "cancella" e la "printf" non ci sono
altre funzioni di allocazione, tutta la tua matrice rimane li.
prova a fare questo
  matrix* myMatrix = AllocMatrix(5,3);
  myMatrix->innerMatrix[1][1]=4;
  cancella(myMatrix);
  myMatrix->innerMatrix[1][1]=5;
  printf("%.1f\n", myMatrix->innerMatrix[1][1]);
 
vedrai che puoi ancora scrivere nella matrice
se invece provi questo
  char* buf;
  matrix* myMatrix = AllocMatrix(5,3);
  myMatrix->innerMatrix[1][1]=4;
  cancella(myMatrix);
  buf = calloc (128,1);
  free (buf);
  printf("%.1f\n", myMatrix->innerMatrix[1][1]);
otterrai un segmentation fault perchè vai
a leggere un'area che è stata sovrascritta,
e i puntatori in essa contenuti non sono validi.
spero di essermi spiegato
ciao

 mi stampa 4. Cosa c'è che non va?
Nulla! :)
Il linguaggio C ha uno standard che puo' a volte apparire strano:
la memoria che tu hai liberato con free() non viene "cancellata"
ma viene "resa disponibile al sistema". Da quel momento il tuo
programma non puo' piu' accedere a quell'area di memoria, se lo
fa si ha il cosiddetto "undefined behaviour", ossia il sistema
e' libero di reagire come vuole: puo' lasciarti accedere
alla memoria senza dare problemi (sembra essere il tuo caso)
oppure puo' andare in errore di protezione della memoria (come
avviene il piu' delle volte) in ogni caso e' a cura del
programmatore assicurarsi che il programma agisca correttamente
e non acceda a memoria liberata.
Prima che lo chiedi: non c'e' un modo per sapere se un puntatore
punta a memoria valida o no. Devi preoccupartene tu, ad esempio
puoi far seguire ogni free da un'assegnazione a NULL.
ciao
Giacomo

 e i puntatori in essa contenuti non sono validi.
Ma è sicuro al 100% oppure è una possibilità, un errore di segmentation 
fault? Voglio dire, calloc potrebbe anche allocare per buf un area di 
memoria diversa da quella puntata da myMatrix... o no?
Grazie!
matteo

 Giacomo
Grazie!
matteo


Esiste una sola "lettura" - la seconda bibbia:
The C Programming Language - Ritchie&Kernighan
Ciao!

Matteo D. wrote:

giusto, è una possibilità.
-- 
Le promesse e la pastafrolla sono fatte per essere infrante
                                             - Jhonatan Swift -