PDA

Visualizza la versione completa : [C] Errore di segmentazione con struct


Ghemon-a
20-01-2011, 13:24
Salve a tutti, ho scritto questo programma che inserisce i nomi di n persone e li stampa a schermo. In fase di compilazione tutto ok, ma quando lo mando in esecuzione mi da "Errore di segmentazione"


#include <stdio.h>
#define DEF 5
typedef struct persona
{
char *nome;
char *cognome;
int anni;
}t_persona;

int main()
{
int i;
t_persona persone[DEF];
for(i=0;i<DEF;i++)
{
scanf("%s",persone[i].nome);
scanf("%s",persone[i].cognome);
scanf("%d",&persone[i].anni);
}
for(i=0;i<DEF;i++)
{
printf("\n%s\n",persone[i].nome);
printf("%s\n",persone[i].cognome);
printf("%d\n\n",persone[i].anni);
}
}

YuYevon
20-01-2011, 13:49
persone[i].nome e persone[i].cognome sono semplici puntatori per i quali non hai allocato spazio. O li dichiari come buffer statici (per esempio: char nome[20]) oppure ricorri all'allocazione dinamica della memoria.

Ghemon-a
20-01-2011, 14:19
Originariamente inviato da YuYevon
persone[i].nome e persone[i].cognome sono semplici puntatori per i quali non hai allocato spazio. O li dichiari come buffer statici (per esempio: char nome[20]) oppure ricorri all'allocazione dinamica della memoria.
Cavolo...quindi dovrei usare la malloc giusto ?

YuYevon
20-01-2011, 14:20
Sì, oppure ricorri all'allocazione statica. In un modo o nell'altro, ci deve essere un'area di memoria allocata in cui scrivere.

Ghemon-a
20-01-2011, 14:33
Come faccio ad allocare dello sapzio ( con malloc ) alla struct persona ?

YuYevon
20-01-2011, 14:38
Non sai usare la malloc() (http://www.cplusplus.com/reference/clibrary/cstdlib/malloc/)? Qual è il problema?

LeleFT
20-01-2011, 14:39
@Ghemon-a: il linguaggio va espressamente indicato nel titolo della discussione.
Per le prossime volte...


Ciao. :ciauz:

Ghemon-a
20-01-2011, 14:47
Ok mod ;)

Sto sulla stessa pagina ma non so come assegnare lo spazio ad una struct, mi potresti scrivere il codice ?

YuYevon
20-01-2011, 14:53
Non devi assegnare spazio alla struct in questo caso, ma ai suoi campi nome e cognome.
In questo modo ad esempio



persone[i].nome = (char *) malloc(sizeof(char) * 10);


assegni spazio per dieci caratteri al campo nome della struct persone[i] (stessa cosa per cognome). Chiaramente in questo modo non ha molto senso perché se devi assegnare staticamente 10 caratteri ogni volta tanto vale ricorrere all'allocazione statica, anzi in quel modo risparmieresti anche il costo della chiamata alla malloc() (e della conseguente chiamata di sistema), ma è chiaro che la cosa può essere generalizzata semplicemente chiedendo prima la lunghezza del nome per poi allocare lo spazio.
Comunque a mio avviso questi sono quei casi in cui è meglio ricorrere all'allocazione statica, tanto al più si spreca qualche byte (evitando però ogni volta l'onere della chiamata alla malloc(), che è ben peggiore).

Ghemon-a
20-01-2011, 15:07
Originariamente inviato da YuYevon
Non devi assegnare spazio alla struct in questo caso, ma ai suoi campi nome e cognome.
In questo modo ad esempio



persone[i].nome = (char *) malloc(sizeof(char) * 10);


assegni spazio per dieci caratteri al campo nome della struct persone[i] (stessa cosa per cognome). Chiaramente in questo modo non ha molto senso perché se devi assegnare staticamente 10 caratteri ogni volta tanto vale ricorrere all'allocazione statica, anzi in quel modo risparmieresti anche il costo della chiamata alla malloc() (e della conseguente chiamata di sistema), ma è chiaro che la cosa può essere generalizzata semplicemente chiedendo prima la lunghezza del nome per poi allocare lo spazio.
Comunque a mio avviso questi sono quei casi in cui è meglio ricorrere all'allocazione statica, tanto al più si spreca qualche byte (evitando però ogni volta l'onere della chiamata alla malloc(), che è ben peggiore).
Ho capito perfettamente il tuo ragionamento, comunque questo è solo un modo per imparare a utilizzare la malloc() :D
Ho provato a fare in questo modo ma non funziona, perchè ?


#include <stdio.h>
#define DEF 5
typedef struct persona
{
char *nome;
char *cognome;
int anni;
}t_persona;

int main()
{
t_persona *x;
x=(t_persona*)malloc(sizeof(t_persona));
int i;
t_persona persone[DEF];
for(i=0;i<DEF;i++)
{
scanf("%s",persone[i].nome);
scanf("%s",persone[i].cognome);
scanf("%d",&persone[i].anni);
}
for(i=0;i<DEF;i++)
{
printf("\n%s\n",persone[i].nome);
printf("%s\n",persone[i].cognome);
printf("%d\n\n",persone[i].anni);
}
}

Loading