Segmentation fault

di il
5 risposte

Segmentation fault

Premessa:
leggo da 2 file diversi una matrice n*n di costi
ed un vettore di n luoghi.
Quindi, tramite la prima funzione, acquisisco i costi:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N_SEDI 9

/* definizione del tipo di dati */
typedef double** matrice_costi;
typedef char** vettore_sedi;

/* 1^ funzione: legge la matrice dei costi */
matrice_costi legge_matrice_costi()
{
	int i,
	    j,
		 n = N_SEDI;
	
	FILE *file_costi;
	
   file_costi = fopen("costi.txt", "r");
   
	matrice_costi costo = (matrice_costi) malloc(n * sizeof(double*));
	
	if(file_costi == NULL)
		printf("Impossibile aprire il file");
	else
	{
		for (i = 0; i < n; i++)
			costo[i] = (double*) malloc(n * sizeof(double));
	
		for (i = 0; i < n; i++)
			for (j = 0; j < n; j++)
				fscanf(file_costi, "%lf", &costo[i][j]);
	}
	
	fclose(file_costi);

	return(costo);
}

/* dealloca i valori letti dal file costi */ 
void dealloca_matrice(matrice_costi valori)
{
	int i,
	    n = N_SEDI;
	
	for (i = 0; i < n; i++)
		free(valori[i]);
	free(valori);
}


mentre, tramite la seconda funzione, leggo il vettore dei luoghi:

/* legge il vettore delle sedi da file */
vettore_sedi legge_vettore_sedi()
{
	int i,
	    n = N_SEDI;
	
	FILE *file_sedi;
	
	file_sedi = fopen("sedi.txt", "r");
	
	vettore_sedi sede = (vettore_sedi) malloc(n * sizeof(char));
	
	if(file_sedi == NULL)
		printf("Impossibile aprire il file");
	else
	{
		for (i = 0; i < n; i++)
			sede[i] = (char*) malloc(n * sizeof(char));
			
		for (i = 0; i < n; i++)
			fscanf(file_sedi, "%s", sede[i]);
	}
	
	fclose(file_sedi);
	
	return(sede);
}

/* dealloca i valori letti dal file sedi */ 
void dealloca_vettore(vettore_sedi valori)
{
	int i,
	    n = N_SEDI;
	
	for (i = 0; i < n; i++)
		free(valori[i]);
	free(valori);
}
Ho il seguente problema:
nel richiamo della seconda funzione per la lettura delle sedi
il dbg mi restituisce l'errore
"segmentation fault"
perchè la dimensione della memoria sembra non essere sufficiente!!

a questo punto sono stato costretto
ad aumentare la memoria impostando nella malloc n*n
vettore_sedi sede = (vettore_sedi) malloc(n*n * sizeof(char));

certo non è una soluzione elegante,
anche perchè, è vero che i valori me li legge correttamente, ma
passandoli ad un'ennesima funzione
il problema "segmentation fault" ovviamente ritorna.

Come risolvere?????
grazie per le eventuali risposte e spero di essere stato chiaro

5 Risposte

  • Re: Segmentation fault

    Cosa vedi che non va quà:
    
       vettore_sedi sede = (vettore_sedi) malloc(n * sizeof(char));
    
  • Re: Segmentation fault

    Il puntatore?????
    vettore_sedi sede = (vettore_sedi) malloc(n * sizeof(char*));
  • Re: Segmentation fault

    E questo?
    
    for (i = 0; i < n; i++)
             sede[i] = (char*) malloc(n * sizeof(char));
             
          for (i = 0; i < n; i++)
             fscanf(file_sedi, "%s", sede[i]);
    
    quanti caratteri ci sono nella stringa sede? Solo 1?
  • Re: Segmentation fault

    No, ogni stringa sede è composta da 2 caratteri!

    In ogni caso, ...
    ho corretto la malloc,
    ed acquisisco correttamente i valori senza problemi,
    ma ...
    passando adesso i valori ad una nuova funzione
    il problema ritorna:
    Program received signal SIGSEGV, Segmentation fault.

  • Re: Segmentation fault

    Prova a mettere il listato completo, almeno si ha un quadro generale del problema.
Devi accedere o registrarti per scrivere nel forum
5 risposte