Problema allocazione dinamica/ strutture

di Anonimizzato14340 il
5 risposte
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

  • Scusa, ho letto ora il regolamento.
    Mi sembrava di aver risolto,invece...
    Ho scritto qui perchè non ho ricevuto risposte nell' altro sito, ho pensato quindi che nessuno fosse in grado di aiutarmi e ho provato in quest'altro forum.
    Scusate se ho violato il regolamento.
  • All'inizio azzera il vettore con

    Info informazioni[10] = {0};

    e poi usa solamente la realloc (non serve la malloc). Ma fai attenzione perché la realloc non aggiunge elementi. Devi indicare la nuova dimensione, quindi

    informazioni[scelta_id].dati_sport = (Sport *)realloc(informazioni[scelta_id].dati_sport, (i+1)*sizeof(Sport));
  • Grazie mille.
    Mi potresti spiegare perchè all' inizio devo mettere Info informazioni[10] = {0}; ?
  • Perché la realloc usa il valore precedente del puntatore e all'inizio deve essere NULL
Devi accedere o registrarti per scrivere nel forum
5 risposte