C programmers never die.
They are just cast into void.

Esempi C - Allocazione dinamica della memoria

Il programma di esempio mostra l'utilizzo delle funzioni malloc, calloc, realloc, free e alloca.

Vengono inizialmente allocate due zone di memoria rispettivamente con le funzioni malloc e calloc per la memorizzazione di 10 valori di tipo int; a parte la differenza di sintassi, che e' visibile dal codice, la calloc effettua anche l'azzeramento della memoria allocata. Se l'allocazione va a buon fine viene restituito un puntatore alla memoria allocata, diversamente viene restituito un puntatore NULL.

Successivamente viene utilizzata la funzione realloc per aumentare la dimensione della memoria allocata; essa viene poi liberata con la funzione free.

Un'alternativa all'uso della malloc e' offerta dalla funzione alloca, che non necessita della chiamata a free ma libera la memoria automaticamente al ritorno della funzione che effettua l'allocazione.

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

int main(int argc, char *argv[]) {

	int i=0;
	int *ptr1 = malloc(10 * sizeof (int));
	int *ptr2 = calloc(10, sizeof (int));

	if( (ptr1 == NULL) || (ptr2 == NULL) ) {
		fprintf(stderr, "Errore nell'allocazione della memoria\n");
		exit(1);
	}

	for(i=0; i<10; i++) {
		*(ptr1+i) = i;
		*(ptr2+i) = i;
		printf("malloc[%d] = %d\tcalloc[%d] = %d\n", i, *(ptr1+i), i, *(ptr2+i));
	}

	printf("\n");

	ptr1 = realloc(ptr1, 20 * sizeof (int));
	ptr2 = realloc(ptr2, 20 * sizeof (int));

	if( (ptr1 == NULL) || (ptr2 == NULL) ) {
		fprintf(stderr, "Errore nell'allocazione della memoria\n");
		exit(1);
	}

	for(i=0; i<20; i++) {
		*(ptr1+i) = i;
		*(ptr2+i) = i;
		printf("re-malloc[%d] = %d\tre-calloc[%d] = %d\n", i, *(ptr1+i), i, *(ptr2+i));
	}

	free(ptr1);
	free(ptr2);

	printf("\n");

	// Con alloca non serve chiamare free...
	ptr1 = alloca(30 * sizeof (int));

	if(ptr1 == NULL) {
		fprintf(stderr, "Errore nell'allocazione della memoria\n");
		exit(1);
	}

	for(i=0; i<30; i++) {
		*(ptr1+i) = i;
		printf("alloca[%d] = %d\n", i, *(ptr1+i));
	}
}