Allocazione dinamica

di Frank2000 il
7 risposte
Ho creato una struttura chiamata matrice così definita :

typedef struct
{
   double **matrice;   /* Matrice */
   int    num_righe;   /* Numero righe della matrice */
   int    num_colonne; /* Numero colonne della matrice */
} matrice_t;

Poi ho creato una funzione che ne fa l'allocazione dinamica , dopo aver inserito il numero di righe e colonne :

void alloca_matrice(matrice_t *mat)
{
   int i;

   /* alloca le righe */

   mat-> matrice = (double **)calloc(mat-> num_righe,sizeof(double *));

   /* alloca le colonne */

   for (i=0;
        i < mat->num_righe;
	i++)
   {
     	   mat-> matrice[i] = (double *)calloc(mat-> num_colonne,sizeof(double));

   }

}

Poi ho fatto una funzione per inserire dati nella matrice :

void riempi_matrice(matrice_t *mat)
{
   int i,
       j;

   for (i=0;
        i < mat->num_righe;
	i++)
   {
	     for(j=0;
	         j < mat->num_colonne;
		 j++)
	     {
		     printf("Inserisci l'elemento nella %d riga e %d colonna ---> ",
		            i + 1, j + 1);
		     scanf("%lf",&mat->matrice[i][j]);
	     }
   }
		     
}

E infine una funzione che stampa la matrice :

void stampa_matrice(matrice_t *mat)
{
   int i,
       j;

   for (i=0;
        i < mat->num_righe;
	i++)
   {
	   printf("\n");
   }
          for(j=0;
              j < mat->num_colonne;
	      j++)
          {
		  printf("%f\t",
		         mat->matrice[i][j]);
	  }
}


Solo che in esecuzione, fino alla funzione che stampa sembra andare tutto bene, ma quando deve stampare la matrice si crea un errore di segmentazione e quindi l'esercuzione non va a buon termine. Non riesco a trovare l'errore, un aiutino?

7 Risposte

  • Ma nella stampa come hai messo quei due cicli?

    Non sono uno dentro l'altro ... dovrebbero essere
    
    	for (i = 0;
    		i < mat->num_righe;
    		i++)
    	{
    		for (j = 0;
    			j < mat->num_colonne;
    			j++)
    		{
    			printf("%f\t",
    				mat->matrice[i][j]);
    		}
    		printf("\n");
    	}
    
    anche se io preferisco
    
    	for (i = 0; i < mat->num_righe; i++)
    	{
    		for (j = 0; j < mat->num_colonne; j++)
    		{
    			printf("%f\t", mat->matrice[i][j]);
    		}
    		printf("\n");
    	}
    
    ma è irrilevante.

    E NON dimenticare la funzione che libera la memoria.
  • oregon ha scritto:


    Ma nella stampa come hai messo quei due cicli?

    Non sono uno dentro l'altro ... dovrebbero essere
    
    	for (i = 0;
    		i < mat->num_righe;
    		i++)
    	{
    		for (j = 0;
    			j < mat->num_colonne;
    			j++)
    		{
    			printf("%f\t",
    				mat->matrice[i][j]);
    		}
    		printf("\n");
    	}
    
    anche se io preferisco
    
    	for (i = 0; i < mat->num_righe; i++)
    	{
    		for (j = 0; j < mat->num_colonne; j++)
    		{
    			printf("%f\t", mat->matrice[i][j]);
    		}
    		printf("\n");
    	}
    
    ma è irrilevante.

    E NON dimenticare la funzione che libera la memoria.
    Ah giusto, grazie mille! Scusa ancora, qual è la funzione che libera la memoria?
  • Usa la free ... trovi tutto nella documentazione della calloc ... come mai non l'hai vista?
  • oregon ha scritto:


    Usa la free ... trovi tutto nella documentazione della calloc ... come mai non l'hai vista?
    si l'ho vista... ma non capisco bene il senso... dovrei metterla alla fine della main?
  • La calloc a che serve secondo te?

    La free fa la cosa opposta altrimenti la memoria resterebbe allocata e inutilizzabile.

    Ovviamente se il processo termina, la memoria viene liberata, ma in condizioni reali la memoria va liberata quando non è più necessaria.
    Se non la usi più dopo la stampa, usi la free per ogni calloc che hai eseguito, ovviamente in ordine opposto all'esecuzione delle calloc, prima le colonne e poi le righe.
  • Quindi metto la free come ultima istruzione nel main?
  • La free va chiamata come per la calloc con dei cicli per ogni puntatore
Devi accedere o registrarti per scrivere nel forum
7 risposte