Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    102

    Errore di segmentazione con struct

    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"
    codice:
    #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);
    	}
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    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.
    every day above ground is a good one

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    102
    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 ?

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Sì, oppure ricorri all'allocazione statica. In un modo o nell'altro, ci deve essere un'area di memoria allocata in cui scrivere.
    every day above ground is a good one

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    102
    Come faccio ad allocare dello sapzio ( con malloc ) alla struct persona ?

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Non sai usare la malloc()? Qual è il problema?
    every day above ground is a good one

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304

    Moderazione

    @Ghemon-a: il linguaggio va espressamente indicato nel titolo della discussione.
    Per le prossime volte...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    102
    Ok mod

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

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Non devi assegnare spazio alla struct in questo caso, ma ai suoi campi nome e cognome.
    In questo modo ad esempio

    codice:
    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).
    every day above ground is a good one

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    102
    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

    codice:
    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()
    Ho provato a fare in questo modo ma non funziona, perchè ?
    codice:
    #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);
    	}
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.