Desreferenciando Ponteiros Nulos ou Inválidos
Tentar desreferenciar um ponteiro nulo é um erro. Na maioria das plataformas, isso geralmente causa um sinal, normalmente SIGSEGV
(veja ).
char *foo = NULL;
c = *foo; /* Isso causa um sinal e termina o programa. */
O mesmo ocorre com um ponteiro que possui alinhamento incorreto para o tipo de dado apontado (em muitos tipos de computadores), ou que aponta para uma parte da memória não alocada no espaço de endereçamento do processo.
Esse sinal termina o programa, a menos que ele tenha sido configurado para lidar com o sinal (veja The GNU C Library em The GNU C Library Reference Manual).
No entanto, o sinal pode não ocorrer se a desreferência for eliminada pela otimização. No exemplo acima, se você não usar posteriormente o valor de c
, o GCC pode otimizar e remover o código de *foo
. Para evitar esse tipo de otimização, você pode usar o qualificador volatile
, como neste exemplo:
volatile char *p;
volatile char c;
c = *p;
Você pode usar isso para testar se p
aponta para memória não alocada. Basta configurar primeiro um tratador de sinal, para que o sinal não termine o programa.
Atualizado
Isto foi útil?