Condividi:
Problemi di HTML? Di PHP, ASP, .NET, JSP, Perl, SQL, JavaScript, Visual Basic..?
Vuoi realizzare programmi in C, C++, Java, Ruby o Smalltalk, e non sai da che parte cominciare?
Entra qui e troverai le risposte!
Moderatori: Anthony47, Triumph Of Steel, archimede
di francowr » 13/04/06 16:06
Ciao a tutti ragazzi,
ho il seguente problema. Se scrivo il seguente programma con C:
- Codice: Seleziona tutto
#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: Seleziona tutto
#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
- Utente Junior
-
- Post: 56
- Iscritto il: 02/06/05 15:56
di francowr » 13/04/06 16:10
scusate ma nel secondo programma non si notano a destra le righe che ho aggiunto: ve le asterisco qui sotto
- Codice: Seleziona tutto
#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
- Utente Junior
-
- Post: 56
- Iscritto il: 02/06/05 15:56
di francowr » 15/04/06 01:23
Lo ho provato a compilare sotto windows e funziona... Forse il compilatore? Cosa mi consigliate???
-
francowr
- Utente Junior
-
- Post: 56
- Iscritto il: 02/06/05 15:56
di GAD » 15/04/06 11:48
union {
long * integer;
char * tizi;
} val;
Questi non sono inizializzati e sono puntatori, si possono generare una miriade di problemi.
Per fare le cose per bene dovresti fare
struct pap *prova;
struct pap pp;
pp.val.integer =(long*) malloc(sizeof(long));
pp.val.tizi=(char*)malloc(sizeof(char));
prova = &pp;
//.... fai quello che vuoi...
// prima di uscire dal prog fai
free(pp.val.integer);
free(pp.val.tizi)
Altrimenti per non usare la variabile statica pp che non serve ad una cippa visto che poi lavori di puntatore
struct pap *prova;
prova = (pap*) malloc(sizeof(pap));
prova ->val.integer =(long*) malloc(sizeof(long));
prova ->val.tizi=(char*)malloc(sizeof(char));
//.... fai quello che vuoi...
// prima di uscire dal prog fai
free(prova->val.integer);
free(prova->val.tizi)
free(prova)
Quando l'ultimo albero sarà abbattuto,l'ultimo pesce catturato,l'ultimo fiume avvelenato,
soltanto allora gli uomini si accorgeranno chei soldi non possono essere mangiati
-
GAD
- Moderatore
-
- Post: 2184
- Iscritto il: 22/09/02 14:36
- Località: Nebbiosa
di francowr » 15/04/06 12:31
Grazie! A esser sinceri a prima letta non mi è chiaro tutto, ma ora vedo, provo e sono sicuro che funzionerà!!!
ciao ciao
-
francowr
- Utente Junior
-
- Post: 56
- Iscritto il: 02/06/05 15:56
di GAD » 15/04/06 13:25
E' che long * integer; e char * tizi; sono due puntatori che non puntano a niente, non sono nemmeno inizializzati. Devi associrali a qualcosa che sia allocato in memoria, sia essa una variabile statica definita da te o un'allocazione dato lo stesso puntatore come ho fatto io con la malloc.
Se ci lavori sopra senza farlo vai in un'area di memoria non definita proprio perche' non essendo inizializzati puntano ad un area di memoria a caso di cui non si sa nemmeno la dimensione.
E' come dover mettere della roba in una scatola di cui non sai ne la grandezza ne dove si trova in questo momento. Prima trovi la scatola, poi decidi quanto deve essere grande e poi la riempi. Se parti a riempire senza aver definito quanto e' grossa e dove sta, i dati ti escono dalla dimensione che il compilatore alloca alla variabile e vanno a sovrascrivere aree che non dovevano toccare.
Es: statico
long ceppo=5;
prova->val.integer=&ceppo;
es. dinamico
prova->val.integer=(long*) malloc(sizeof(long));
Quando l'ultimo albero sarà abbattuto,l'ultimo pesce catturato,l'ultimo fiume avvelenato,
soltanto allora gli uomini si accorgeranno chei soldi non possono essere mangiati
-
GAD
- Moderatore
-
- Post: 2184
- Iscritto il: 22/09/02 14:36
- Località: Nebbiosa
di GAD » 15/04/06 13:27
ps: guarda questi link e cerca anche su google "c allocazione puntatori" e troverai un po' di spiegazioni piu' dettagliate
http://a2.pluto.it/a2497.htm
http://ada2.unipv.it/biblio/trickyc/08c.htm
Quando l'ultimo albero sarà abbattuto,l'ultimo pesce catturato,l'ultimo fiume avvelenato,
soltanto allora gli uomini si accorgeranno chei soldi non possono essere mangiati
-
GAD
- Moderatore
-
- Post: 2184
- Iscritto il: 22/09/02 14:36
- Località: Nebbiosa
di francowr » 15/04/06 13:57
Ti ringrazio, sei stato fin troppo cortese a spiegarmi il tutto. Ora penso di aver capito cmq! CIAO!!!!
-
francowr
- Utente Junior
-
- Post: 56
- Iscritto il: 02/06/05 15:56
di francowr » 15/04/06 14:32
Compilato con windows funziona tutto, una volta inclusa la libreria alloc.h!
Con linux (libreria malloc.h, ma come dice il link che mi hai incluso credo dipenda dal compilatore) devo escludere:
free(pp.val.integer);
free(pp.val.tizi)
Altrimenti mi da il seguente errore:
*** glibc detected *** double free or corruption (fasttop): 0x0804a018 ***
Aborted
Cmq funziona!!! Ora provo a vedere con il programma vero e proprio (quelloc he avevo riportato qui era solo un esempio per spiegare che tipo di problema avevo...)
Grazie ancora!!
CIAO
-
francowr
- Utente Junior
-
- Post: 56
- Iscritto il: 02/06/05 15:56
di BianConiglio » 16/04/06 21:41
non ho letto nulla, solo l'ultimo post..
devi fare free(pp) credo
ciau
-
BianConiglio
- Utente Senior
-
- Post: 4710
- Iscritto il: 26/12/01 01:00
- Località: Varese / Lugano
-
di francowr » 16/04/06 22:18
Grazie! ora ci provo!
ciao
-
francowr
- Utente Junior
-
- Post: 56
- Iscritto il: 02/06/05 15:56
Torna a Programmazione
Topic correlati a "Segmentation Fault con strutture in linguaggio C":
Chi c’è in linea
Visitano il forum: Nessuno e 52 ospiti