/* File: puntator.c */
/* Time-stamp: "2001-04-02 01:23:56 calvanes" */
/* Scopo: esempi base su puntatori ad oggetti dinamici
          con commenti dettagliati sulla gestione della memoria a run time */

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


int main(void)
{

  int *pi;
  int *pj;

                            /* SITUAZIONE INIZIALE

                                             **STACK**           **HEAP**
                                                                 _________
                                             |        |         |   ?   | | 001
                                             |========|         |   ?   | | 002
                            RDA di         pi|   ?    |         |   ?   | | 003
                            main           pj|   ?    |         |  ...  | | ...
                                             |________|         |_______|_|
                            #################### */
                            
  pi = malloc(sizeof(int)); /* allocazione dinamica di memoria */

                            /*                                   _________
                                             |        |         |   ?   | | 001
                                             |========|         |   ?   | | 002
                            RDA di         pi|   -------------->|   ?   |*| 003
                            main           pj|   ?    |         |  ...  | | ...
                                             |________|         |_______|_|
                            #################### */
                            
  *pi = 150; /* ora *pi ha un valore significativo */

                            /*                                   _________
                                             |        |         |   ?   | | 001
                                             |========|         |   ?   | | 002
                            RDA di         pi|   -------------->|  150  |*| 003
                            main           pj|   ?    |         |  ...  | | ...
                                             |________|         |_______|_| 
                            #################### */
                            
  pj = pi; /* pi e pj PUNTANO ALLA STESSA CELLA DI MEMORIA */

                            /*                                   _________
                                             |        |         |   ?   | | 001
                                             |========|         |   ?   | | 002
                            RDA di         pi|   -----------+-->|  150  |*| 003
                            main             |        |     |   |  ...  | |
                                           pj|   --------->-+   |  ...  | | ...
                                             |________|         |_______|_| 
                            #################### */
                            
  free(pj); /* deallocazione di *pj, E QUINDI ANCHE DI *pi */

                            /*                                   _________
                                             |        |         |   ?   | | 001
                                             |========|         |   ?   | | 002
                            RDA di         pi|   -----------+-->|   ?   | | 003
                            main             |        |     |   |  ...  | |
                                           pj|   --------->-+   |  ...  | | ...
                                             |________|         |_______|_|
                            #################### */
                            
  pi = malloc(sizeof(int)); /* allocazione dinamica di memoria */

                            /*                                   _________
                                             |        |   +---->|   ?   |*| 001
                                             |========|   |     |   ?   | | 002
                            RDA di         pi|   ------->-+  +->|   ?   | | 003
                            main             |        |      |  |  ...  | | ...
                                           pj|   ------->----+  |  ...  | | ...
                                             |________|         |_______|_| 
                            #################### */
                            
  *pi = 4000; /* ora *pi ha di nuovo un valore significativo */

                            /*                                   _________
                                             |        |   +---->| 4000  |*| 001
                                             |========|   |     |   ?   | | 002
                            RDA di         pi|   ------->-+  +->|   ?   | | 003
                            main             |        |      |  |  ...  | | ...
                                           pj|   ------->----+  |  ...  | | ...
                                             |________|         |_______|_| 
                            #################### */
                            
  pj = malloc(sizeof(int)); /* allocazione dinamica di memoria */

                            /*                                   _________
                                             |        |   +---->| 4000  |*| 001
                                             |========|   |     |   ?   | | 002
                            RDA di         pi|   ------->-+     |  ...  | | ...
                            main           pj|   -------------->|   ?   |*| 573
                                             |________|         |  ...  | | ...
                                                                |_______|_| 
                            #################### */
                            
  *pj = *pi; /* le celle contengono lo stesso valore */

                            /*                                    _________
                                             |        |   +---->| 4000  |*| 001
                                             |========|   |     |   ?   | | 002
                            RDA di         pi|   ---------+     |  ...  | | ...
                            main           pj|   -------------->| 4000  |*| 573
                                             |________|         |  ...  | | ...
                                                                |_______|_| 
                            */
                            
  pj = malloc(sizeof(int)); /* ERRORE METODOLOGICO:          */
                            /* HO PERSO UNA CELLA DI MEMORIA */

                            /*                                   _________
                                             |        |   +---->| 4000  |*| 001
                                             |========|   |     |   ?   | | 002
                            RDA di         pi|   ---------+     |  ...  | | ...
                            main           pj|   ----------+    | 4000  |*| 573
                                             |________|    |    |  ...  | | ...
                                                           +--->|   ?   |*| 812
                                                                |  ...  | | ...
                                                                |_______|_| 
                            #################### */

  return 0;
}