La valeur du pointeur nul représente un "nulle part" bien défini; il s'agit d'une valeur de pointeur non valide qui est garantie de comparer inégale à toute autre valeur de pointeur. Tenter de déréférencer un pointeur nul entraîne un comportement indéfini et conduit généralement à une erreur d'exécution, vous devez donc vous assurer qu'un pointeur n'est pas NULL avant de tenter de déréférencer. Un certain nombre de fonctions de bibliothèque C et C ++ renverront un pointeur nul pour indiquer une condition d'erreur. Par exemple, la fonction de bibliothèque malloc
renverra une valeur de pointeur nulle si elle ne peut pas allouer le nombre d'octets qui ont été demandés, et tenter d'accéder à la mémoire via ce pointeur entraînera (généralement) une erreur d'exécution:
int *p = malloc(sizeof *p * N);
p[0] = ...; // this will (usually) blow up if malloc returned NULL
Nous devons donc nous assurer que l' malloc
appel a réussi en vérifiant la valeur de par p
rapport à NULL:
int *p = malloc(sizeof *p * N);
if (p != NULL) // or just if (p)
p[0] = ...;
Maintenant, accrochez-vous à vos chaussettes une minute, cela va devenir un peu cahoteux.
Il existe une valeur de pointeur nul et une constante de pointeur nul , et les deux ne sont pas nécessairement les mêmes. La valeur du pointeur nul correspond à la valeur que l'architecture sous-jacente utilise pour représenter "nulle part". Cette valeur peut être 0x00000000, ou 0xFFFFFFFF, ou 0xDEADBEEF, ou quelque chose de complètement différent. Ne supposez pas que la valeur du pointeur nul est toujours 0.
La constante de pointeur nul , OTOH, est toujours une expression intégrale à valeur 0. En ce qui concerne votre code source , 0 (ou toute expression intégrale évaluée à 0) représente un pointeur nul. C et C ++ définissent la macro NULL comme constante de pointeur null. Lorsque votre code est compilé, la constante de pointeur nul sera remplacée par la valeur de pointeur nul appropriée dans le code machine généré.
Sachez également que NULL n'est qu'une des nombreuses valeurs de pointeur non valides possibles ; si vous déclarez une variable de pointeur automatique sans l'initialiser explicitement, comme
int *p;
la valeur initialement stockée dans la variable est indéterminée et peut ne pas correspondre à une adresse mémoire valide ou accessible. Malheureusement, il n'existe aucun moyen (portable) de savoir si une valeur de pointeur non NULL est valide ou non avant d'essayer de l'utiliser. Donc, si vous avez affaire à des pointeurs, c'est généralement une bonne idée de les initialiser explicitement sur NULL lorsque vous les déclarez et de les définir sur NULL lorsqu'ils ne pointent activement vers rien.
Notez que c'est plus un problème en C qu'en C ++; idiomatique C ++ ne devrait pas utiliser autant de pointeurs.