Puntatori NULL
Fa parte della sezione Logica e flusso del percorso C di Coddy. Lezione 5 di 63.
A volte devi dichiarare un puntatore, ma non hai subito un indirizzo di memoria valido da assegnargli. In queste situazioni, è importante inizializzare il puntatore con un valore speciale chiamato NULL.
Un puntatore NULL è un puntatore che non punta a nessun indirizzo di memoria valido. In C, NULL è tipicamente definito come 0 o (void*)0. Quando inizializzi un puntatore a NULL, stai dichiarando esplicitamente che al momento non punta a nulla di utile.
int *ptr = NULL; // Inizializza il puntatore a NULL
printf("%p", ptr); // Questo stamperà 0 o (nil)Inizializzare i puntatori a NULL è considerata una buona pratica di programmazione perché impedisce al puntatore di contenere valori casuali spazzatura. Un puntatore non inizializzato potrebbe contenere un indirizzo di memoria casuale qualsiasi, il che potrebbe causare un comportamento imprevedibile se provi accidentalmente a usarlo.
Puoi controllare se un puntatore è NULL prima di usarlo: questo aiuta a prevenire gli arresti anomali e rende il tuo codice più robusto. Questo controllo di sicurezza diventa particolarmente importante man mano che i tuoi programmi diventano più complessi.
Sfida
FacileScrivi un programma in C che dimostri la corretta inizializzazione e verifica dei puntatori NULL. Il programma dovrebbe:
- Dichiarare un puntatore a un intero chiamato
safe_ptre inizializzarlo a NULL - Dichiarare un puntatore a un carattere chiamato
char_ptre inizializzarlo a NULL - Verificare se
safe_ptrè NULL usando un'istruzione if e stampare "safe_ptr is NULL" se lo è - Verificare se
char_ptrè NULL usando un'istruzione if e stampare "char_ptr is NULL" se lo è - Stampare l'indirizzo di memoria memorizzato in
safe_ptrusandoprintfcon lo specificatore di formato%p - Stampare l'indirizzo di memoria memorizzato in
char_ptrusandoprintfcon lo specificatore di formato%p
L'output dovrebbe mostrare i risultati nel seguente formato:
safe_ptr is NULL
char_ptr is NULL
safe_ptr address: [address]
char_ptr address: [address]Gli indirizzi di memoria effettivi saranno visualizzati come 0, (nil) o una rappresentazione NULL simile, a seconda del sistema, ma il formato e le etichette devono corrispondere esattamente a quanto mostrato sopra.
Provalo tu
#include <stdio.h>
int main() {
// TODO: Scrivi qui il tuo codice
// Dichiara e inizializza i tuoi puntatori
// Controlla se i puntatori sono NULL
// Stampa l'output richiesto
return 0;
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Fondamenti dei puntatori
Che cos’è un puntatore?Dichiarare i puntatoriL’operatore di indirizzo (&)L’operatore di dereferenziazione (*)Puntatori NULLRiepilogo: nozioni di base sui puntatori4Progetto: Utility di testo semplice
Panoramica del progettoConteggio dei caratteri2Puntatori e array
I nomi degli array come puntatoriElementi degli array e puntatoriAritmetica dei puntatoriConfrontare i puntatoriRiepilogo: attraversamento di un array con i puntatori5Puntatori e funzioni
Passaggio per valorePassare puntatori alle funzioniModificare le variabili tramite puntatoriUn esempio classico: scambiare valoriPassare array alle funzioniRiepilogo: argomenti puntatore nelle funzioni3Array di caratteri e stringhe
Stringhe come array di charIl terminatore nullInput di stringhe con scanfUso di strlen()Uso di strcpy()Uso di strcat()Uso di strcmp()Riepilogo: funzioni di base per le stringhe6Gestione della memoria
Memoria Stack vs. HeapAllocazione dinamica - malloc()Usare sizeof() per l'allocazioneVerificare il fallimento dell'allocazioneLiberare la memoria con free()Allocare con calloc()Riepilogo: array dinamico9Progetto: Inserimento semplice di un contatto
Progetto: Definire una struct ContattoFunzione per creare un contattoEsercitati da solo: Compilatore C online