PDA

Visualizza la versione completa : [C] Errore "segmentation fault" da Linux 32 bit a 64 bit


puntovale
11-06-2007, 12:20
Salve! secondo voi c' qualche motivo particolare per cui un codice compilato ed eseguito correttamente su un pc a 32 bit su linux funziona correttamente mentre lo stesso codice compilato ed eseguito su un pc a 64 bit (sempre su linux) d segment fault ?
Il codice crea una matrice nxn allocando dinamicamente lo spazio necessario (per intenderci uso la funzione calloc per allocare lo spazio necessario). Quando il codice cerca di riempire la matrice con semplici valori costanti, ottengo il segment fault.

oregon
11-06-2007, 12:48
Ci possono essere tanti motivi, ma se posti la parte del codice dove si verifica il problema, si puo' essere piu' precisi ...

puntovale
11-06-2007, 14:03
grazie per la risposta. Provo a darti maggiori info. Ho una struttura dati grafo cos fatta presente nella libreria libgraph

dichiarata in libgraph.h
typedef struct
{
unsigned int *vertices;
unsigned int **weight;
unsigned int num_vertices;
}graph;

La matrice incriminata weight.
Creo ed alloco lo spazio necessario al grafo con la funzione dichiarata in libgraph

graph* init_graph(value num_vertices)
{
int i;
graph *g;
g = (graph *)malloc(sizeof(graph));
g->num_vertices = num_vertices;
g->vertices = (vertex *)malloc(g->num_vertices*sizeof(vertex));
g->weight = (value **)calloc(g->num_vertices,sizeof(value));
for(i=0;i<g->num_vertices;i++)

g->weight[i]=(value *) calloc(g->num_vertices,sizeof(value));
return g;
}

Nel mio codice dichiaro un puntatore al grafo
graph *g;

alloco lo spazio necessario chiamando la funzione di prima

g = init_graph(8)

ed inizializzo la matrie cos

for(i = 0; i < 8/*g->num_vertices*/; i++)
for(l = 0; l < 8/*g->num_vertices*/; l++)
{
g->weight[i][l] = 0;
}

Il problema risiede proprio in quest ultimo pezzo di codice. Ad un certo punto, mentre il programma inizializza la matrice, si interrompe con un segment fault. Tra l'altro l'errore non capita nemmeno ai "bordi" della matrice il che farebbe pensare che si cerca di accedere ad uno spazio di memoria non allocato. Ripeto il codice su una macchina a 32bit funziona bene

oregon
11-06-2007, 15:09
Cosa e' value ?

puntovale
11-06-2007, 15:32
a si scusa non ti ho postato l'ultima versione del codice: value ed index sono entrambi unsigned int.
Nell'ultima versione del codice ho sostituito value e index direttamente con unsigned int proprio per evitare che ci fossero problemi nel casting

oregon
11-06-2007, 16:57
Non ho controllato approfonditamente (anche perche' il codice non e' scritto chiaramente ... devi usare i tag [ CODE ] per inserirli nel forum ...) ma credo che questa

g->weight = (value **)calloc(g->num_vertices,sizeof(value));

dovrebbe essere

g->weight = (value **)calloc(g->num_vertices,sizeof(value *));

puntovale
11-06-2007, 18:02
Hai perfettamente ragione! ora funziona grazie mille

XWolverineX
11-06-2007, 19:14
e perch sul sistema a 32 bit funzionava???

oregon
11-06-2007, 19:28
La spiegazione stai nella differenza tra i valori di

sizeof(unsigned int) e sizeof(unsigned int *)

nei sistemi a 32 e 64 bit ...

puntovale
11-06-2007, 20:18
se ho capito bene sizeof(unsigned int ) e sizeof(unsigned int *) su sistemi a 32 bit hanno la stessa grandezza poich un intero 32 bit proprio come l'indirizzo ( e quindi il puntatore)
mentre su sistemi a 64 bit il dato (o forse l'indirizzo ???) 64 bit mentre l'altro a 32

Loading