Allocazione dinamica

di il
7 risposte

Allocazione dinamica

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

  • Re: Allocazione dinamica

    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.
  • Re: Allocazione dinamica

    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?
  • Re: Allocazione dinamica

    Usa la free ... trovi tutto nella documentazione della calloc ... come mai non l'hai vista?
  • Re: Allocazione dinamica

    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?
  • Re: Allocazione dinamica

    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.
  • Re: Allocazione dinamica

    Quindi metto la free come ultima istruzione nel main?
  • Re: Allocazione dinamica

    La free va chiamata come per la calloc con dei cicli per ogni puntatore
Devi accedere o registrarti per scrivere nel forum
7 risposte