O valor do ponteiro nulo representa um "lugar nenhum" bem definido; é um valor de ponteiro inválido que é garantido para comparar com qualquer outro valor de ponteiro. Tentar desreferenciar um ponteiro nulo resulta em um comportamento indefinido e geralmente levará a um erro de tempo de execução. Portanto, você deseja garantir que um ponteiro não seja NULL antes de tentar desreferê-lo. Um número de funções da biblioteca C e C ++ retornará um ponteiro nulo para indicar uma condição de erro. Por exemplo, a função de biblioteca malloc
retornará um valor de ponteiro nulo se não puder alocar o número de bytes que foram solicitados, e tentar acessar a memória através desse ponteiro (normalmente) levará a um erro de tempo de execução:
int *p = malloc(sizeof *p * N);
p[0] = ...; // this will (usually) blow up if malloc returned NULL
Portanto, precisamos garantir que a malloc
chamada tenha êxito, verificando o valor de p
contra NULL:
int *p = malloc(sizeof *p * N);
if (p != NULL) // or just if (p)
p[0] = ...;
Agora, segure suas meias por um minuto, isso vai ficar um pouco acidentado.
Há um valor de ponteiro nulo e uma constante de ponteiro nulo , e os dois não são necessariamente os mesmos. O valor do ponteiro nulo é o valor que a arquitetura subjacente usa para representar "lugar nenhum". Este valor pode ser 0x00000000 ou 0xFFFFFFFF ou 0xDEADBEEF ou algo completamente diferente. Não suponha que o valor do ponteiro nulo seja sempre 0.
A constante de ponteiro nulo , OTOH, é sempre uma expressão integral com valor 0. No que diz respeito ao seu código-fonte , 0 (ou qualquer expressão integral avaliada como 0) representa um ponteiro nulo. C e C ++ definem a macro NULL como a constante de ponteiro nulo. Quando seu código é compilado, a constante de ponteiro nulo será substituída pelo valor apropriado de ponteiro nulo no código de máquina gerado.
Além disso, esteja ciente de que NULL é apenas um dos muitos possíveis valores inválidos de ponteiro; se você declarar uma variável de ponteiro automático sem inicializá-la explicitamente, como
int *p;
o valor inicialmente armazenado na variável é indeterminado e pode não corresponder a um endereço de memória válido ou acessível. Infelizmente, não há uma maneira (portátil) de saber se um valor de ponteiro não NULL é válido ou não antes de tentar usá-lo. Portanto, se você estiver lidando com ponteiros, geralmente é uma boa ideia inicializá-los explicitamente para NULL quando você os declarar e defini-los como NULL quando não estiverem apontando ativamente para nada.
Observe que isso é mais um problema em C do que em C ++; o C ++ idiomático não deve usar tanto os ponteiros.