Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Problema con puntatori e strutture dinamiche
Forum - C/C++ - Problema con puntatori e strutture dinamiche

Avatar
Arat (Normal User)
Newbie


Messaggi: 8
Iscritto: 24/09/2014

Segnala al moderatore
Postato alle 21:48
Giovedì, 13/11/2014
Ciao a tutti, sto imparando da solo il C, e sto facendo una specie di programma gestionale proposto in un libro. Devo realizzare una struttura dinamica su cui si possono eseguire varie funzioni. Il problema è che già arrivati alla funzione stampa sto incontrando dei problemi abbastanza importanti dato che mi crasha per qualche motivo che non riesco proprio a comprendere. Qualcuno potrebbe aiutarmi? Grazie mille

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct
  5. {
  6.  int day;
  7.  int month;
  8.  int year;
  9. } DATE_T;
  10.  
  11. typedef struct {
  12.     DATE_T date;
  13.     int codice;
  14.     int codiceProdotto;
  15.     int n;
  16. } GESTIONE_T;
  17.  
  18. GESTIONE_T *gestione;
  19. int index = 0;
  20.  
  21. void add(GESTIONE_T *gestione);
  22. void stampa(GESTIONE_T *gestione);
  23.  
  24. int main()
  25. {
  26.     printf("1 - Inserimento ");
  27.     add(gestione);
  28.  
  29.     printf("2 - Stampa");
  30.     stampa(gestione);
  31.  
  32.     return 0;
  33. }
  34.  
  35. void add(GESTIONE_T *gestione)
  36. {
  37.     gestione = (GESTIONE_T*) malloc((index + 1) * sizeof(GESTIONE_T));
  38.     if (gestione == NULL) {
  39.         printf("Errore durante l'allocazione della memoria");
  40.         exit(EXIT_FAILURE);
  41.     }
  42.  
  43.     printf("\nInserisci il tuo codice identificativo: ");
  44.     scanf("%d", &gestione[index].codice);
  45.     printf("test 1 : %d", gestione[index].codice);
  46.  
  47.     printf("\nInserisci il codice del prodotto: ");
  48.     scanf("%d", &gestione[index].codiceProdotto);
  49.     printf("test 2 : %d", gestione[index].codiceProdotto);
  50.  
  51.    /* printf("\nInserisci il numero di oggetti venduti: ");
  52.     scanf("%d", &gestione[index].n);
  53.     printf("test 3 : %d",gestione[index].n);*/
  54.  
  55.     index++;
  56.  
  57.     printf("\nInserisci la data nel formato GG/MM/YY: ");
  58.     scanf("%d/%d/%d", &gestione[index].date.day, &gestione[index].date.month, &gestione[index].date.year);
  59.     return;
  60. }
  61.  
  62. void stampa(GESTIONE_T *gestione)
  63. {
  64.  
  65.     printf("Code: %d - Codice prodotto: %d - Numero: ", (gestione + index)->codice, (gestione + index)->codiceProdotto);
  66.  
  67.     return;
  68. }


PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 22:25
Giovedì, 13/11/2014
Un problema (forse c'e' ne sono altri) e' qui:

Codice sorgente - presumibilmente Plain Text

  1. gestione = (GESTIONE_T*) malloc((index + 1) * sizeof(GESTIONE_T));



Ad ogni chiamata tu allochi un nuovo blocco di memoria (che peraltro diventa piu' e piu' grande ad ogni chiamata, vista l'espressione index + 1). Quando questo succede però, il riferimento alla memoria precedente viene perso.

In pratica alla prima chiamata: (? = memoria allocata ma non inizializzata, probabilmente 0 se il compilatore è furbo)

gestione: [record1, ?]

Alla seconda chiamata:

gestione: [record2, ?, ?]

Alla terza:

gestione: [record3, ?, ?, ?]

Eccetera...

Mentre il risultato che vuoi tu (alla terza chiamata) dovrebbe avere:

gestione: [record1, record2, record3]


Il mio blog: https://piero.dev
PM Quote