Donc si vous le faites:
void *ptr = NULL;
Quel est le meilleur moyen de vérifier si ce pointeur vide est NULL?
Ma solution pour l'instant est la suivante:
if (*(void**)ptr == NULL) ...
Mais cela ne semble pas être la meilleure solution, car je suppose implicitement que ptr est de type void ** (ce qui n’est pas le cas).
J'écrirais simplement if (!ptr)
.
NULL
est fondamentalement juste 0
et !0
est vrai.
Assurez-vous d'inclure une définition de NULL.
#include <stddef.h>
void *X = NULL;
// do stuff
if (X != NULL) // etc.
Si vous incluez <stdio.h>
et similaire, alors stddef.h
est automatiquement intégré.
Enfin, il est intéressant de regarder la définition de NULL dans stddef.h
et, ce faisant, vous verrez pourquoi votre première idée de ce qu'il faut faire est intéressante.
Un pointeur NULL est un pointeur qui ne pointe nulle part. Sa valeur est généralement définie dans stddef.h
comme suit:
#define NULL ((void*) 0)
ou
#define NULL 0
Puisque NULL est égal à zéro, une instruction if
pour vérifier si un pointeur est NULL vérifie si ce pointeur est à zéro. Par conséquent, if (ptr)
est évalué à 1 lorsque le pointeur n'est pas NULL et inversement, if (!ptr)
est évalué à 1 lorsque le pointeur est NULL.
Votre approche if (*(void**)ptr == NULL)
convertit le pointeur void
en un pointeur vers un pointeur, puis tente de le déréférencer. Un pointeur point à point déréférencé génère un pointeur. Cela peut donc sembler une approche valide. Cependant, étant donné que ptr
est NULL, lorsque vous la déréférence, vous invoquez un comportement non défini.
Il est beaucoup plus simple de vérifier if (ptr == NULL)
ou, en utilisant la notation abrégée, if (!ptr)
.
Si votre code parvient à se compiler lors de l'affectation de void *ptr = NULL
, il va sans dire qu'une simple instruction if
pour comparer si elle est NULL
devrait suffire, en particulier parce que NULL
devrait être défini si le code peut être compilé.
Exemple de moyen suffisant pour vérifier:
if(ptr==NULL)
{
rest of code...
}
J'ai écrit un petit programme de test, compilé avec gcc sur linux, qui fonctionne:
int main()
{
void *ptr = NULL;
if(ptr==NULL)
{
return 1;
}
return 0;
}
Je sais que ceci est un peu ancien, mais je voulais ajouter quelque chose qui pourrait être utile.
Ce que je fais habituellement est quelque chose comme ça,
Ceci est ma fonction.
void MyMethod( const void* l_pData ///< Source data
, size_t l_nLen /**< Number of bytes to convert */) {
// Return if nothing is provided
if (l_pData == NULL || ((const char*)(l_pData))[0] == '\0' || 0 == l_nLen) {
return;
}
// Rest of the code
}
Vous pouvez vérifier
- Null data
- Empty data
- Invalid length
Les suivants sont validés
MyMethod("", 10);
MyMethod(" ", 10);
MyMethod(NULL, 10);
MyMethod("valid", 0);