/* 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; }