Maison  >  Article  >  développement back-end  >  Pourquoi l’appel d’une méthode via un pointeur nul en C fonctionne-t-il parfois ?

Pourquoi l’appel d’une méthode via un pointeur nul en C fonctionne-t-il parfois ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-01 02:27:27925parcourir

Why Does Invoking a Method Through a Null Pointer in C   Sometimes Work?

Comprendre le comportement non défini : invocation de méthode de pointeur nul en C

Malgré l'attente apparemment intuitive d'une erreur, l'invocation de méthodes via des pointeurs nuls en C peut sembler s'exécuter. Ce comportement soulève des questions concernant les pratiques de conformité et d'optimisation standard utilisées par les compilateurs.

Pour approfondir ce sujet, considérons l'exemple suivant :

<code class="cpp">#include <iostream>
using namespace std;

class test
{
    int i;
public:
    test():i(0){ cout << "ctor called" << endl;}
    void show()
    {
        cout << "show fun called" << endl;
    }
};

int main(int argc , char *argv[])
{
    test *ptr = NULL;
    ptr->show();
    return 0;
}</code>

Dans cet extrait, un test de classe est défini avec un constructeur et une méthode show(). Dans la fonction main(), un pointeur ptr est initialisé à NULL puis la méthode show() est invoquée via ptr.

Étonnamment, le programme s'exécute sans erreur et affiche "show fun appelé" sans déclencher le constructeur . Cela est dû au fait qu'en C , le compilateur connaît le type du pointeur nul, ce qui lui permet d'identifier le code de la méthode. Étant donné que la méthode show() n'utilise pas le pointeur this, elle s'exécute avec succès.

Cependant, ce comportement est considéré comme non défini dans la norme C. Les compilateurs sont autorisés à optimiser le code en ne vérifiant pas si un pointeur est NULL avant d'appeler une méthode. Bien que cette optimisation améliore l'efficacité, elle compromet la sécurité et la prévisibilité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn