Uso Memoria
Allocazione Dinamica della Memoria
In C, non esistono concetti di classi come in linguaggi di programmazione orientati agli oggetti, come C++. Tuttavia, è possibile definire variabili con diverse classi di memorizzazione, come `auto`, `static`, e `register`.
Classi di Memorizzazione
`auto`
La parola chiave `auto` viene utilizzata per dichiarare variabili locali all'interno di una funzione, ma la sua utilità è stata ridotta con l'evoluzione del linguaggio e viene spesso omessa, poiché la maggior parte delle variabili locali è già automatica.
#include <stdio.h>
int main() {
auto int x = 5; // Dichiarazione equivalente a int x = 5;
printf("%d\n", x);
return 0;
}
`static`
La parola chiave `static` viene utilizzata per definire variabili che mantengono il loro valore tra le chiamate di una funzione.
Può anche essere utilizzata per limitare la visibilità di variabili e funzioni a livello di file.
#include <stdio.h>
void funzione() {
static int conteggio = 0;
conteggio++;
printf("Conteggio: %d\n", conteggio);
}
int main() {
funzione();
funzione();
funzione();
return 0;
}
`register`
La parola chiave `register` viene utilizzata per dichiarare variabili locali che possono essere archiviate nei registri della CPU, rendendole più veloci da accedere rispetto alla memoria. Tuttavia, il compilatore può ignorare la richiesta di utilizzare un registro.
#include <stdio.h>
int main() {
register int i;
for (i = 0; i < 5; i++) {
printf("%d ", i);
}
return 0;
}
Allocazione Dinamica della Memoria
`malloc` e `free`
La funzione `malloc` (Memory Allocation) viene utilizzata per allocare una quantità specifica di memoria dinamica. La funzione `free` viene utilizzata per liberare la memoria allocata.
#include <stdio.h>
#include <stdlib.h>
int main() {
int* array;
// Allocazione di memoria per un array di 5 interi
array = (int*)malloc(5 * sizeof(int));
if (array == NULL) {
printf("Errore di allocazione di memoria.\n");
return 1;
}
// Utilizzo dell'array
for (int i = 0; i < 5; i++) {
array[i] = i;
printf("%d ", array[i]);
}
// Liberazione della memoria
free(array);
return 0;
}
`calloc` e `realloc`
La funzione `calloc` (Contiguous Allocation) viene utilizzata per allocare una quantità specifica di memoria inizializzata a zero.
La funzione `realloc` (Reallocate) viene utilizzata per ridimensionare o modificare l'allocazione di memoria precedentemente allocata.
#include <stdio.h>
#include <stdlib.h>
int main() {
int* array;
// Allocazione di memoria per un array di 3 interi inizializzati a zero
array = (int*)calloc(3, sizeof(int));
if (array == NULL) {
printf("Errore di allocazione di memoria.\n");
return 1;
}
// Utilizzo dell'array
for (int i = 0; i < 3; i++) {
printf("%d ", array[i]);
}
// Ridimensionamento dell'array a 5 elementi utilizzando realloc
array = (int*)realloc(array, 5 * sizeof(int));
if (array == NULL) {
printf("Errore di riallocazione di memoria.\n");
return 1;
}
// Utilizzo dell'array dopo la riallocazione
for (int i = 0; i < 5; i++) {
array[i] = i;
printf("%d ", array[i]);
}
// Liberazione della memoria
free(array);
return 0;
}
Le funzioni `malloc`, `calloc`, e `realloc` forniscono un mezzo per gestire la memoria dinamica in C, ma è importante ricordare di liberare la memoria utilizzando `free` per evitare perdite di memoria.