Usare la funzione malloc con una struttura

di il
6 risposte

Usare la funzione malloc con una struttura

Salve raga sto creando un programma per gestire una classe scolastica ma mi da un bel pericolo quando provo ad allocare della memoria questo programmino deve essere in grado di acquisire ogni volta che si vuole una nuova persona e poi stampare tutto l'elenco vi posto il sorgente


#include <stdio.h>

struct studenti
{  char *nome;
    char *cognome;
    char matricola[15];
};


void stampa(struct studenti*);
void inserisci(struct studenti*);
int main()
{   int scelta;
    struct studenti *alunni = NULL;
    do{
    printf(" _________________________\n");
    printf("|1: inserisci i dati------|\n");
    printf("|2: stampa----------------|\n");
    printf("|3:exit-------------------|\n");
    printf("|-------------------------|\n");
    scanf("%d",&scelta);
    
    
    if(scelta==1)
    {
        inserisci(alunni);
    
    }
          if(scelta==2)
        
        {
        stampa(alunni);
    
        }
    
    
    
    }while(scelta!=3);
    return 0;
}




void inserisci(struct studenti *alunno)
{
    alunno=(struct studenti*)malloc(sizeof(struct studenti));// pericolo sto implicitamente usando un valore di ritono del tipo void
    printf("inserisci il nome\n");
    alunno->nome=(char*)malloc(sizeof(struct studenti));
    scanf("%s",alunno->nome);
    printf("inserisci il cognome\n");
      alunno->cognome=(char*)malloc(sizeof(struct studenti));
    scanf("%s",alunno->cognome);
    printf("inserisci il numero di matricola\n");
     
    scanf("%s",alunno->matricola);
    

}


void stampa(struct studenti *alunno){
//quale posso usare come conizione necessaria che mi stampi tutti gli alunni??
    printf("_________________________________\n");
    printf("|%c                                                     \n",*alunno->nome);
    printf("|%c                                                      \n",*alunno->cognome);
    printf("|%c                                                      \n",*alunno->matricola);
    printf("_________________________________\n");


}

6 Risposte

  • Re: Usare la funzione malloc con una struttura

    Sono arrivato alla conclusione di fare una listra di strutture ma anche se credo che tutto a righe di codice funzioni il mio compilatore non è altrettanto d'accordo vi posto il nuovo sorgente per tutti i "pazzi " che vorranno leggerlo e aiutarmi p.s. l'errore è logico e non sintattico grazie a tutti
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    struct studenti
    {  char *nome;
        char *cognome;
        char matricola[15];
        struct studenti*next;
    };
    
    
    void stampa(struct studenti*);
    void inserisci(struct studenti*);
    int main()
    {   int scelta;
        struct studenti *alunni ;
      
        alunni=(struct studenti*)malloc(sizeof(struct studenti));
        
          alunni->next=NULL;
        do{
        printf(" _________________________\n");
        printf("|1: inserisci i dati------|\n");
        printf("|2: stampa----------------|\n");
        printf("|3: exit------------------|\n");
        printf("|-------------------------|\n");
        scanf("%d",&scelta);
        
        
        if(scelta==1)
        {
            inserisci(alunni);
        
        }
              if(scelta==2)
            
            {
            stampa(alunni);
        
            }
        
        
        
        }while(scelta!=3);
        
        alunni=NULL;
        
        return 0;
    }
    
    
    
    void inserisci(struct studenti *alunno)
    {
    
        char *nome,*cognome,*matricola;
        
        cognome=nome=matricola=(char*)malloc(4);
            
        while(alunno->next!=NULL){
        
            alunno=alunno->next;  // vado avanti nella lista fino a che non trovo l'ultimo
        
        
        }
            printf("inserisci un nome\n");
        scanf("%s",nome);
        
        alunno->nome=(char*)malloc(strlen(nome+1)*sizeof(char*));// prendo memoria lo stretto indispensabile
        strcpy(alunno->nome,nome);// copia del dato nella struttura
        
        printf("inserisci il cognome\n");
        scanf("%s",cognome);
        alunno->cognome=(char*)malloc(strlen(cognome+1)*sizeof(char*));
        strcpy(alunno->cognome,cognome);
        
        
        printf("inserisci la matricola\n");
        scanf("%s",matricola);
        alunno->matricola[0]=*(char*)malloc(strlen(matricola+1)*sizeof(char*));
        strcpy(alunno->matricola,matricola);
        
        
    
    }
    
    void stampa(struct studenti *alunno){
        while(alunno->next!=NULL){  // scorro fino all'ultimo elemento e mentre lo faccio stampo
        printf("_________________________________\n");
        puts(alunno->nome);
        puts(alunno->cognome);
        puts(alunno->matricola);
        printf("_________________________________\n");
            alunno=alunno->next;
        }
    
    }
    
  • Re: Usare la funzione malloc con una struttura

    Ci sono vari problemini. I primi che affiorano sono i seguenti:
    1) nella inserisci non allochi spazio per la struttura ma solo per le stringhe in essa contenute. Quindi, non crei il nuovo elemento della lista;
    2) il meccanismo di passaggio del puntatore di inizio lista non è corretto. Tu usi un passaggio by value mentre invece dovresti usare un passaggio by reference per poter aggiornare il puntatore di inizio lista al di fuori della funzione inserisci.
    Ciao.
  • Re: Usare la funzione malloc con una struttura

    Mi potresti indicare precisamente dove??grazie
  • Re: Usare la funzione malloc con una struttura

    Eccoti servito:
    
    void inserisci(struct studenti *alunno)
    {
    }
    
    I primi problemi che ho visto nella precedente funzione sono la mancata allocazione della memoria per l'elemento della lista che vorresti creare/aggiungere e l'uso del passaggio by value del puntatore di inizio lista. Cosa quest'ultima che non è opportuna/corretta in una funzione che dovrebbe aggiungere un elemento all'inizio della lista.
    Spero ti sia d'aiuto.
    Ciao
  • Re: Usare la funzione malloc con una struttura

    Quindi per correggere il passaggio by valute mi servirebbe un puntatore a puntatore giusto? l'allocazione non è corretta farla quando chiamo la funzione inserisci??
  • Re: Usare la funzione malloc con una struttura

    Si potresti allocare memoria prima di chiamare la tua funzione. Però lo dovresti fare ogni volta e in modo opportuno. Comunque non ti conviene.
Devi accedere o registrarti per scrivere nel forum
6 risposte