Malloc e Free
Queste funzioni permettono di creare nuovi oggetti non durante la compilazione, ma durante l'esecuzione del programma, consentendo l'utilizzo della allocazione dinamica della memoria.
malloc()
In precedenza, per allocare memoria per i nostri dati, si dichiarava semplicemente:
int x;
Ora, con la funzione malloc(), è possibile allocare memoria dinamicamente:
int* pX = (int*)malloc(4);
La funzione malloc() richiede come argomento il numero di byte da allocare. Se non si conosce la dimensione in byte necessaria, ma si conosce il tipo di dato da memorizzare, è possibile modificare l'espressione in questo modo:
int* pX = (int*)malloc(sizeof(int));
Cosa succede dopo?
Si noti che il risultato della funzione malloc() viene assegnato a un puntatore. Questo significa che malloc() restituisce un indirizzo!
Il prefisso (int*) è un cast esplicito. Si specifica manualmente il tipo desiderato. Ad esempio:
double x = 3.14;
int y = (int)x; // `y` = 3
Main.c
1234567891011#include <stdio.h> #include <stdlib.h> // new header file! int main() { int* pX = (int*)malloc(sizeof(int)); printf("Address of allocated memory: %p\n", pX); return 0; }
Nota
Ricordare di includere il file di intestazione
stdlib.h. Contiene il prototipo della funzionemalloc().
Per memorizzare dati all'indirizzo fornito dalla funzione malloc(), si utilizza l'operatore di dereferenziazione.
Main.c
123456789101112#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf(" Value %d at address %p\n", *pX, pX); return 0; }
È possibile liberare la memoria? – Sì, ma solo la memoria allocata da malloc() e funzioni simili.
free()
Questa funzione viene utilizzata con i puntatori. Per illustrare, espandiamo l'esempio sopra:
Main.c
1234567891011121314151617#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf(" Value %d at address %p\n", *pX, pX); free(pX); printf("After `free()` value %d at address %p\n", *pX, pX); return 0; }
Curiosamente, anche dopo aver "eliminato" un puntatore, esso rimane funzionante, ma il valore memorizzato nella sua posizione di memoria associata diventa corrotto.
Questo comporta un problema: una cella di memoria occupata ora contiene dati inaffidabili. Per evitare questi puntatori, il puntatore utilizzato dovrebbe essere reimpostato a NULL.
Main.c
1234567891011121314151617#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf("Value %d at address %p\n", *pX, pX); free(pX); pX = NULL; return 0; }
Impostare un puntatore a NULL dopo aver liberato la sua memoria è un modo chiaro per indicare che il puntatore non fa più riferimento a una posizione di memoria valida.
Verificare sempre se il puntatore è NULL prima di utilizzarlo per assicurarsi di non accedere a memoria non valida o già allocata.
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione
Awesome!
Completion rate improved to 2.63
Malloc e Free
Scorri per mostrare il menu
Queste funzioni permettono di creare nuovi oggetti non durante la compilazione, ma durante l'esecuzione del programma, consentendo l'utilizzo della allocazione dinamica della memoria.
malloc()
In precedenza, per allocare memoria per i nostri dati, si dichiarava semplicemente:
int x;
Ora, con la funzione malloc(), è possibile allocare memoria dinamicamente:
int* pX = (int*)malloc(4);
La funzione malloc() richiede come argomento il numero di byte da allocare. Se non si conosce la dimensione in byte necessaria, ma si conosce il tipo di dato da memorizzare, è possibile modificare l'espressione in questo modo:
int* pX = (int*)malloc(sizeof(int));
Cosa succede dopo?
Si noti che il risultato della funzione malloc() viene assegnato a un puntatore. Questo significa che malloc() restituisce un indirizzo!
Il prefisso (int*) è un cast esplicito. Si specifica manualmente il tipo desiderato. Ad esempio:
double x = 3.14;
int y = (int)x; // `y` = 3
Main.c
1234567891011#include <stdio.h> #include <stdlib.h> // new header file! int main() { int* pX = (int*)malloc(sizeof(int)); printf("Address of allocated memory: %p\n", pX); return 0; }
Nota
Ricordare di includere il file di intestazione
stdlib.h. Contiene il prototipo della funzionemalloc().
Per memorizzare dati all'indirizzo fornito dalla funzione malloc(), si utilizza l'operatore di dereferenziazione.
Main.c
123456789101112#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf(" Value %d at address %p\n", *pX, pX); return 0; }
È possibile liberare la memoria? – Sì, ma solo la memoria allocata da malloc() e funzioni simili.
free()
Questa funzione viene utilizzata con i puntatori. Per illustrare, espandiamo l'esempio sopra:
Main.c
1234567891011121314151617#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf(" Value %d at address %p\n", *pX, pX); free(pX); printf("After `free()` value %d at address %p\n", *pX, pX); return 0; }
Curiosamente, anche dopo aver "eliminato" un puntatore, esso rimane funzionante, ma il valore memorizzato nella sua posizione di memoria associata diventa corrotto.
Questo comporta un problema: una cella di memoria occupata ora contiene dati inaffidabili. Per evitare questi puntatori, il puntatore utilizzato dovrebbe essere reimpostato a NULL.
Main.c
1234567891011121314151617#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf("Value %d at address %p\n", *pX, pX); free(pX); pX = NULL; return 0; }
Impostare un puntatore a NULL dopo aver liberato la sua memoria è un modo chiaro per indicare che il puntatore non fa più riferimento a una posizione di memoria valida.
Verificare sempre se il puntatore è NULL prima di utilizzarlo per assicurarsi di non accedere a memoria non valida o già allocata.
Grazie per i tuoi commenti!