PDA

View Full Version : Segmentation Fault con strutture in linguaggio C


francowr
14-04-2006, 22:39
Ciao a tutti ragazzi,
ho il seguente problema. Se scrivo il seguente programma con C:

Codice:
#include <stdio.h>

main()
{
struct pap {int pippo;
int pluto;
union {
long * integer;
char * tizi;
} val;
};

struct pap *prova;
struct pap pp;

prova = &pp; // sono costretto ad inizializzarlo

prova->pluto=45;

*prova->val.integer=4;

printf ("Valore= %d\n", prova->pluto);

printf ("Valore= %ld\n", *prova->val.integer);

return 0;
}




In linux lo compilo e riesco pure a far girare l'esegubile poi.

nel seguente programma invece (che evolve dal precedente, ho scritto + a destra solo le righe che ho aggiunto):




Codice:
#include <stdio.h>

main()
{
struct pap {int pippo;
int pluto;
union {
long * integer;
char * tizi;
} val;
};

struct pap *prova;
struct pap pp;

struct pap *prova2;
struct pap pp2;

prova = &pp; // sono costretto ad inizializzarlo

prova->pluto=45;

*prova->val.integer=4;

printf ("Valore= %d\n", prova->pluto);

printf ("Valore= %ld\n", *prova->val.integer);

prova2 =&pp2;
*prova2->val.integer=3;
printf ("Valore= %ld\n", *prova2->val.integer);

return 0;
}




In questo caso lo compilo sempre ma l'eseguibile va in Segmentation fault; che cosa sbaglio???
GRAZIE!!!! CIAO

francowr
14-04-2006, 22:40
scusate ma nel secondo programma non si notano a destra le righe che ho aggiunto: ve le asterisco qui sotto





Codice:
#include <stdio.h>

main()
{
struct pap {int pippo;
int pluto;
union {
long * integer;
char * tizi;
} val;
};

struct pap *prova;
struct pap pp;

****** struct pap *prova2;
****** struct pap pp2;

prova = &pp; // sono costretto ad inizializzarlo

prova->pluto=45;

*prova->val.integer=4;

printf ("Valore= %d\n", prova->pluto);

printf ("Valore= %ld\n", *prova->val.integer);

****** prova2 =&pp2;
****** *prova2->val.integer=3;
******** printf ("Valore= %ld\n", *prova2->val.integer);

return 0;
}




non capisco aggiungendo queste righe (che fanno la stessa cosa, sono identiche, a quello che fa i primo programma nelle altre righe poi...) che succede ...

francowr
15-04-2006, 02:24
Lo ho provato a compilare sotto windows e funziona... Forse il compilatore? Cosa mi consigliate???

71104
15-04-2006, 14:34
quando fai cosė:
*prova->val.integer=4;
stai assegnando un valore ad una cosa che non punta a niente: il membro "integer" non č inizializzato.

k0nt3
15-04-2006, 18:35
infatti non capisco come ti funziona su win... assegni il valore 4 a un puntatore a long... essendo un puntatore ci devi assegnare un indirizzo!