Problema allocazione dinamica/ strutture

di il
5 risposte

Problema allocazione dinamica/ strutture

Salve,
ho una struttura, con all'interno un campo di tipo struttura.
Definisco la prima struttura come un vettore di strutture con dimensione fissa.
Il mio problema consiste nell'allocare memoria per il campo struttura della struttura principale.
I dati verranno inseriti inseriti ogni volta che viene chiamata la funzione Aggiungi.
Purtroppo dopo l'inserimento di un paio di dati il programma va in segmetation fault .
Qualcuno può suggerire una soluzione al mio problema ? oppure farmi capire dove sbaglio ? Grazie mille.

Ecco il codice :

#include <stdio.h>
#include <stdlib.h>

typedef struct {

    char Nome_sport[25];
    int Ore;

}Sport;

typedef struct {

    int ID;
    Sport *dati_sport;

}Info;

void Aggiungi(int,int,Info *);
void Visualizza(Info *,int,int);


int main()
{

int scelta;
int x = 1;
Info informazioni[10];
int scelta_id;
int i = 0;
int numero[10];


for(i=0;i<10;i++)
   numero[i] = 0;


do{

printf("\n[1] Aggiungi \t[2] Visualizza \t[0] Esci \n");

do{

     scanf("%d",&scelta);
     if( scelta < 0 || scelta > 2 )
                {
                    printf("\nScelta non valida...\n");
                    printf("\n[1] Aggiungi \t[2] Visualizza \t[0] Esci \n");
                }
 }while(scelta < 0 || scelta > 2 );

switch(scelta){

case 1 :
         printf("\nInserisci l'id : ");
         scanf("%d",&scelta_id);

         i = numero[scelta_id];

         Aggiungi( i,scelta_id,informazioni);
         numero[scelta_id]++;
         printf("\n--- %d ---\n",numero[scelta_id]);

         break;
case 2 :
         printf("\nInserisci l'id  : ");
         scanf("%d",&scelta_id);
         i = numero[scelta_id];

         Visualizza(informazioni,scelta_id,i);
         break;

case 0 :
         x = 2;
         break;

}

}while(x==1);

return 0;
}

void Aggiungi(int i,int scelta_id,Info *informazioni)
{



    if(i == 0)
    {
        informazioni[scelta_id].dati_sport = (Sport *)malloc(sizeof(Sport));



                            if(informazioni[scelta_id].dati_sport == NULL){

                                             printf("Errore");
                                             exit(1);

                                             }
    }
    else
        {
         informazioni[scelta_id].dati_sport = (Sport *)realloc(informazioni[scelta_id].dati_sport, sizeof(Sport));


                            if(informazioni[scelta_id].dati_sport == NULL){

                                             printf("Errore");
                                             exit(1);

                                             }
        }

    informazioni[scelta_id].ID = scelta_id;

    printf("\nInserisci i dati :");

                    printf("\nNome sport :");
                    getchar();
                    gets(informazioni[scelta_id].dati_sport[i].Nome_sport);

                    printf("\nInserisci le ore :");
                    scanf("%d",&informazioni[scelta_id].dati_sport[i].Ore);



}

void Visualizza(Info *informazioni,int scelta_id,int i){

int k;
printf("\nID : %d",informazioni[scelta_id].ID);

for(k=0;k < i;k++)
    {

        printf("\nNome sport : %s",informazioni[scelta_id].dati_sport[k].Nome_sport);
        printf("\nOre : %d\n",informazioni[scelta_id].dati_sport[k].Ore);

    }

}

5 Risposte

Devi accedere o registrarti per scrivere nel forum
5 risposte