Ci sono due errori:
- il primo è che non allochi soazio per matrice2, ma matrice2 la fai puntare a matrice, pero prima di leggere deallochi matrice, quindi matrice2 punta a memoria deallocata; il modo correto di procedere e di allocare spazio indipendente per matrice2;
- il secondo errore è nelle fwrite e nelle fread, perchè passi un puntatore da cui leggere o in cui scrivere, e dai come dimensione 42, ma matrice e matrice2 non sono un array lineare in cui ci sono tutti i 42 elementi in fila, ma sono dei puntatori a puntatori, ogni riga delle matrici è stata allocata separatamente, quindi i 7 elementi della rima riga stanno in una porzione di memoria, i 7 elementi della seconda riga stanno in un altra porzione di memoria, non puoi semplicemente passare il puntatore alla prima riga perche i 42 elementi non sono tutti a partire da li. Difatti fread e fwrite vogliono come argomento un void*, mtnre tu passi un puntatore a puntatre; morale della favola le righe vanno scritte e lette separatamente.
codice:
#include <stdio.h>
#include <stdlib.h>
int ** alloca_matrice (int righe, int colonne);
void dealloca_matrice(int **matrix, int righe);
void inizializza_matrice (int **matrix, int righe, int colonne);
void stampa_matrice(int **matrix, int righe, int colonne);
int main ()
{
char *filename = "save.dat";
FILE *fp;
int **matrice = NULL, **matrice2;
matrice = alloca_matrice(6,7);
inizializza_matrice(matrice, 6,7);
matrice2 = alloca_matrice(6,7);;
printf("Matrice originaria:\n\n");
stampa_matrice(matrice, 6, 7);
fp = fopen(filename, "wb");
int i;
for(i = 0; i < 6; i++)
fwrite(matrice[i], sizeof(int), 7, fp);
fclose(fp);
dealloca_matrice(matrice, 6);
fp = fopen(filename, "rb");
for(i = 0; i < 6; i++)
fread(matrice2[i], sizeof(int), 7, fp);
fclose(fp);
printf("\n\nMatrice letta da file:\n\n");
stampa_matrice(matrice2, 6, 7);
dealloca_matrice(matrice2, 6);
return 0;
}
int ** alloca_matrice (int righe, int colonne)
{
int **matrix, i;
if(!(matrix= (int **) malloc (righe * sizeof(int *))))
return(NULL);
for (i=0; i<righe; i++)
{
if(!(matrix[i]= (int *) malloc(colonne * sizeof(int))))
return(NULL);
}
return(matrix);
}
void dealloca_matrice(int **matrix, int righe)
{
int i=0;
for(i=0; i<righe; i++)
{
free(matrix[i]);
}
free(matrix);
}
void inizializza_matrice (int **matrix, int righe, int colonne)
{
int i, j;
for (i=0; i<righe; i++) {
for (j=0; j<colonne; j++) {
matrix[i][j]= 0;
}
}
}
void stampa_matrice(int **matrix, int righe, int colonne){
int i, j;
for(i = 0; i < righe; i++){
for(j = 0; j < colonne; j++)
printf("%d ", matrix[i][j]);
printf("\n");
}
}