Maison > développement back-end > C++ > 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
Libérer: 2024-11-01 02:27:27
original
1034 Les gens l'ont consulté

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal