Comment puis-je vérifier si un pointeur à NULL?
Le titre peut être un peu un abus de langage... juste parce que je ne suis pas sûr si mon char pointeur pointe vers NULL, ou si c'est juste pointant vers un char tableau de taille 0.
J'ai donc
char* data = getenv("QUERY_STRING");
Et je veux vérifier si les données sont null (ou de la longueur < 1). J'ai essayé:
if(strlen(data)<1)
mais j'obtiens une erreur:
==24945== Invalid read of size 1
==24945== at 0x8048BF9: main (in /cpp.cgi)
==24945== Address 0x1 is not stack'd, malloc'd or (recently) free'd
J'ai aussi essayé de
if(data == NULL)
mais avec le même résultat.
Ce qui se passe ici? J'ai déjà essayé de cout avec les données, et cela fonctionne bien. Je n'arrive pas à vérifier si elle est null ou vide.
Je me rends compte ce sont deux choses différentes (null et vide). Je veux savoir lequel des données devrait être ici, et comment faire pour vérifier si elle est null/vide.
- Remarque: Vous devez utiliser
const char*
, paschar*
. À partir de le C++ (C++) docs:The string pointed by the pointer returned by this function shall not be modified by the program.
Vous devez vous connecter pour publier un commentaire.
Avec la fonction getenv, vous avez à gérer les deux cas! (Yay!!!) Si la variable d'environnement n'est pas définie, alors la fonction retourne NULL. Si elle est définie, alors vous obtenez un pointeur vers la valeur de l'ensemble, qui peut être vide. Donc:
Évidemment, vous devez vérifier si elle est NULL avant de tenter de déterminer sa longueur, ou lire l'un des personnages les points de -- c'est pourquoi les deux conditions ci-dessus
if
sont classées de la façon dont ils sont.if (data && *data) { ... }
if (data && data[0] != '\0')
. J'ai ajouté le!= NULL
de faire ma réponse plus claire.En général, vous devriez vérifier avec quelque chose comme ça. La première partie vérifie le pointeur null, la deuxième vérifie une chaîne vide en vérifiant le premier caractère pour le terminateur null à la fin de chaque chaîne.
Votre problème ressemble à une interaction spécifique entre
getenv
etstrlen
qui n'est pas standard.getenv
retourne un pointeur normal null, C-string.strlen
est conçue pour ceux trier des chaînes de caractères.\0
?!data[0]
sera plus courte.data[0] == '\0'
. Note!*data
est encore plus court! 🙂 Je ne suis pas en utilisantstrlen
, j'étais simplement en pointant, pour Marquer que ce n'est pas ce qui est à l'origine du problème avec une chaîne de caractères obtenue à partir degetenv
.strlen
effectue quelques vérifications pour un pointeur valide avant qu'il ne commence. Sigetenv
est le retour des pointeurs vers une certaine partie de la mémoire réservée par le système d'exploitation pour les variables d'environnement, il peut déclencher les contrôles tout en étant un pointeur valide.strlen
fonctionne comme prévu pour un validegetenv
-valeur retournée, si.printf("%d\n", strlen(0));
tue application sur les deux msvc/gcc-mingw. Vous êtes libre de vérifier si c'est la norme-conforme.