Maison > Article > développement back-end > Pourquoi l’appel d’une méthode via un pointeur nul en C fonctionne-t-il parfois ?
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!