68 votes

Comment vérifions-nous si un pointeur est un pointeur NULL?

Je pense toujours simplement que if(p != NULL){..} fera l'affaire. Mais après avoir lu cette question sur Stack Overflow, il semble que non.

Alors quelle est la manière canonique de vérifier les pointeurs NULL après avoir absorbé toute la discussion de cette question qui dit que les pointeurs NULL peuvent avoir une valeur non nulle?

4 votes

Ce n'est pas du c... c'est un fil c++... personnellement, je choisirais : if(p) {...}

4 votes

Vous vous inquiétez trop - votre code est bon, même en C++. Cette discussion était entre quelques juristes du langage - c'est un peu du genre "combien d'anges peuvent danser sur la tête d'une épingle".

0 votes

@forsvarir, quand if(p) sera-t-il différent de if(p != NULL)?

3voto

R.. Points 93718

La représentation des pointeurs est sans importance pour les comparer, car toutes les comparaisons en C se font en tant que valeurs et non en tant que représentations. La seule façon de comparer la représentation serait quelque chose d'hideux comme :

static const char ptr_rep[sizeof ptr] = { 0 };
if (!memcmp(&ptr, ptr_rep, sizeof ptr)) ...

0 votes

@R.., peut-être pouvez-vous ajouter quelques mots à ce sujet :) Il me semble que cela devrait être !memcmp(ptr, ptr_rep, sizeof ptr) au moins...

1 votes

Non, ma version est correcte. Vous voulez comparer la représentation de ptr, pas la représentation de ce vers quoi il pointe, donc vous avez besoin de l'adresse de la variable ptr.

0 votes

@R.., que se passe-t-il lorsque vous comparez un pointeur avec un entier non nul, se produit-il une conversion implicite ? Ou est-ce comme l'a dit @James Kanze, un compilateur qui accepte de comparer un pointeur avec un entier, autre qu'une constante pointeur nul, est sérieusement défectueux ?

2voto

JohnJohn Points 297

Eh bien, cette question a été posée et répondue en 2011, mais il existe nullptr dans C++11. C'est tout ce que j'utilise actuellement.

Vous pouvez lire plus sur Stack Overflow et aussi sur cet article.

1 votes

La question n'excluait pas C++11. Vous pouvez en apprendre davantage à partir des deux liens ci-dessus.

1 votes

Je ne sais pas si tu essaies juste d'énerver les gens ou quoi que ce soit. Les liens que j'ai fournis donnent beaucoup d'explications. Il est inutile - et ce serait mal - de copier-coller le contenu des liens ici. Comme sa question a déjà été répondue sur stackoverlow. J'ai fourni la solution en disant 'vous pouvez utiliser nullptr en C++11' tout en donnant les liens pour plus de clarté. Si j'avais écrit if(p == nullptr) {}. dans la réponse également, ce serait juste une insulte à l'OP. nullptr EST la manière canonique telle qu'incluse dans le standard officiel de C++. Ton manque de décence ne gaspillera plus mon temps.

0voto

Misha Taylor Points 27
//Faites ceci

int IS_NULL_PTR(char *k){
memset(&k, k, sizeof k);
if(k) { return 71; } ;
return 72;
}
int PRINT_PTR_SAFE(char *KR){
    char *E=KR;;
    if (IS_NULL_PTR(KR)==71){
        printf("%s\r\n",KR);
    } else {
        printf("%s","(null)\r\n");
    }
}
int main(int argc,char *argv[]){
    int i=0;
    char *A=malloc(sizeof(char)*9);
    ;strcpy(A,"hello world");
    for (i=((int)(A))-10;i<1e+40;i++){
        PRINT_PTR_SAFE(i);
    }

}
//Ensuite regardez le spectacle !
//Modifiez comme vous le souhaitez. Créditez-moi si vous voulez vraiment plus de cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X