Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Malloc e Free | Puntatori
Fondamenti Di C

bookMalloc 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

Main.c

copy
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 funzione malloc().

Per memorizzare dati all'indirizzo fornito dalla funzione malloc(), si utilizza l'operatore di dereferenziazione.

Main.c

Main.c

copy
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

Main.c

copy
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

Main.c

copy
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.

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 6. Capitolo 4

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Awesome!

Completion rate improved to 2.63

bookMalloc 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

Main.c

copy
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 funzione malloc().

Per memorizzare dati all'indirizzo fornito dalla funzione malloc(), si utilizza l'operatore di dereferenziazione.

Main.c

Main.c

copy
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

Main.c

copy
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

Main.c

copy
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.

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 6. Capitolo 4
some-alt