Appunti di programmazione

Appunti per il corso universitario di programmazione, riferito al linguaggio ANSI C
Redatti all'università di Venezia

ARGOMENTI

STRUTTURA COMPUTER

DEFINIZIONI

TASTIERA E TIPI

AMBIENTE E MEMORIA

COMANDI

FUNZIONI E PROCEDURE

TIPI DERIVATI

PUNTATORI

STRINGHE

ARRAY DI PUNTATORI

STRUTTURE

TYPEDEF E ENUM

PUNTATORI A PROCEDURE

ALLOCAZIONE DINAMICA

LISTE

ALGORITMI

ERRORI

MEMORIA

variabili viste sino ad ora:

  • hanno associato un nome

  • hanno una portata (la memoria in cui vengono allocate ha una struttura a pila)

  • la loro vita dipende dal codice

  • sono risultato solo di dichiarazioni e non di comandi (non esistono comandi che restituiscano nuove variabili)

  • non posso dichiarare variabili di dimensioni arbitrarie


sono tutte caratteristiche della memoria di tipo stack = statica = a pila:


heap (mucchio) = altra parte di memoria con variabili con diverse caratteristiche:

  • possono non avere un nome

  • la loro vita è indipendente dal codice (può essere determinata a tempo di esecuzione)

  • sono risultato di una computazione (di un comando)

stack = memoria statica -> variabili statiche

heap = memoria dinamica -> variabili dinamiche

ALLOCAZIONE DINAMICA DELLA MEMORIA

MALLOC

(memory allocation)

esegue:

  • allocazione di memoria

  • restituzione dell'indirizzo di locazione

riceve la dimensione del tipo e restituisce un indirizzo

es.

void main(){

int x;

int *y;

y = (int*) malloc(sizeof(int));

x = 7;

*y = x + 1;

}


perchè dobbiamo utilizzare il casting ? in stdio.h troviamo:

void *malloc(int x);

void non significa in questo caso nulla, bensì sta ad indicare che malloc può restituire un puntatore di qualsiasi tipo

FREE

void free(indirizzo di memoria);

si occupa di deallocare le variabili allocate dinamicamente (dichiara riallocabile una locazione di memoria)


void main(){

int x;

int *y;

y = (int*) malloc(sizeof(int));

x = 7;

free(y); // y è l'indirizzo di una certa variabile intera, non sto deallocando

*y = 4; // non posso farlo perchè cerco di utilizzare una variabile che non esiste più

*y = x + 1;

y = &x;

free(y); // non si può più fare perchè y contiene l'indirizzo di una variabile statica

}


char x;

char *y;

char **z;

x = 'a';

y = (char *) malloc(sizeof(char));

*y = 'b';

z = &y; // z è una variabile di tipo puntatore a puntatore a carattere, e assegno a questo l'indirizzo di y


int *x;

x = (int *) malloc(sizeof(char));


se devo allocare una stringa:

char *c;

c = (char *) malloc(3*sizeof(char));

meglio utilizzare:

c = (char *) calloc(3, sizeof(char));


posso applicare strcpy anche per stringhe contenute nello heap

Ritorna sopra | Home page