Ponteiros NULL
Parte da seção Logic & Flow do Journey de C da Coddy — lição 5 de 63.
Às vezes, você precisa declarar um ponteiro, mas não tem um endereço de memória válido para atribuir a ele imediatamente. Nessas situações, é importante inicializar o ponteiro com um valor especial chamado NULL.
Um ponteiro NULL é um ponteiro que não aponta para nenhum endereço de memória válido. Em C, NULL é tipicamente definido como 0 ou (void*)0. Quando você inicializa um ponteiro como NULL, você está declarando explicitamente que ele não aponta para nada útil no momento.
int *ptr = NULL; // Inicializa o ponteiro como NULL
printf("%p", ptr); // Isso imprimirá 0 ou (nil)Inicializar ponteiros como NULL é considerado uma boa prática de programação porque evita que seu ponteiro contenha valores de lixo aleatórios. Um ponteiro não inicializado pode conter qualquer endereço de memória aleatório, o que pode levar a um comportamento imprevisível se você acidentalmente tentar usá-lo.
Você pode verificar se um ponteiro é NULL antes de usá-lo, o que ajuda a evitar falhas e torna seu código mais robusto. Essa verificação de segurança torna-se especialmente importante à medida que seus programas se tornam mais complexos.
Desafio
FácilEscreva um programa em C que demonstre a inicialização e a verificação adequadas de ponteiros NULL. Seu programa deve:
- Declarar um ponteiro para um inteiro chamado
safe_ptre inicializá-lo como NULL - Declarar um ponteiro para um caractere chamado
char_ptre inicializá-lo como NULL - Verificar se
safe_ptré NULL usando uma instrução if e imprimir "safe_ptr is NULL" se for - Verificar se
char_ptré NULL usando uma instrução if e imprimir "char_ptr is NULL" se for - Imprimir o endereço de memória armazenado em
safe_ptrusandoprintfcom o especificador de formato%p - Imprimir o endereço de memória armazenado em
char_ptrusandoprintfcom o especificador de formato%p
Sua saída deve exibir os resultados no seguinte formato:
safe_ptr is NULL
char_ptr is NULL
safe_ptr address: [address]
char_ptr address: [address]Os endereços de memória reais aparecerão como 0, (nil) ou representação NULL semelhante, dependendo do seu sistema, mas o formato e os rótulos devem corresponder exatamente ao mostrado acima.
Folha de consulta
Um ponteiro NULL é um ponteiro que não aponta para nenhum endereço de memória válido. Em C, NULL é tipicamente definido como 0 ou (void*)0.
Inicialize ponteiros como NULL para evitar valores de lixo aleatórios:
int *ptr = NULL; // Inicializa o ponteiro como NULL
printf("%p", ptr); // Isso imprimirá 0 ou (nil)Verifique se um ponteiro é NULL antes de usá-lo para evitar falhas (crashes):
if (ptr == NULL) {
// Seguro para lidar com o caso NULL
}Experimente você mesmo
#include <stdio.h>
int main() {
// TODO: Escreva seu código aqui
// Declare e inicialize seus ponteiros
// Verifique se os ponteiros são NULL
// Imprima a saída necessária
return 0;
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Logic & Flow
1Fundamentos de Ponteiros
O que é um Ponteiro?Declarando PonteirosO Operador de Endereço (&)O Operador de Desreferência (*)Ponteiros NULLRecapitulação: Fundamentos de Ponteiros4Projeto: Utilitário de Texto Simples
Visão Geral do ProjetoContando Caracteres2Ponteiros e Arrays
Nomes de Arrays como PonteirosElementos de Array - PonteirosAritmética de PonteirosComparando PonteirosRecapitulação: Percorrendo Arrays com Ponteiros5Ponteiros e Funções
Passagem por ValorPassando Ponteiros para FunçõesModificando Variáveis via PonteirosUm Exemplo Clássico: SwapPassando Arrays para FunçõesRecapitulação: Ponteiros como Argumentos3Arrays de Caracteres e Strings
Strings como Arrays de charO Terminador NuloEntrada de Strings com scanfUsando strlen()Usando strcpy()Usando strcat()Usando strcmp()Recapitulação: Funções Básicas de Strings6Gerenciamento de Memória
Memória Stack vs. HeapAlocação Dinâmica - malloc()Usando sizeof() para AlocaçãoVerificando Falhas de AlocaçãoLiberando Memória com free()Alocando com calloc()Recapitulação: Array Dinâmico9Projeto: Cadastro Simples de Contatos
Projeto: Definir a Struct de ContatoFunção para Criar um Contato