Maison  >  Article  >  développement back-end  >  Pouvez-vous accéder aux membres statiques en C à l’aide de pointeurs nuls sans comportement non défini ?

Pouvez-vous accéder aux membres statiques en C à l’aide de pointeurs nuls sans comportement non défini ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-02 11:53:03177parcourir

Can You Access Static Members in C   Using Null Pointers Without Undefined Behavior?

Accès aux membres statiques à l'aide de pointeurs nuls en C

En C , les membres statiques d'une classe sont accessibles via un pointeur nul sans invoquer un comportement non défini. Ce comportement, qui peut paraître surprenant, peut s'expliquer en examinant les définitions et la justification du langage.

Évaluation des pointeurs non initialisés

Lors de l'accès à un membre de la classe via un pointeur nul, le comportement est bien- défini tant que l'évaluation de l'opérande ne nécessite pas l'identité du référent ou la valeur stockée. Par exemple, l'accès à une variable membre statique d->a évalue simplement l'expression *(d) pour obtenir la référence à l'objet, mais n'effectue pas d'opérations nécessitant l'initialisation du référent.

Cette évaluation Le processus est pris en charge par [expr.ref]/2, qui indique que d->a est converti en ((d)).a. L'évaluation de ((d)), représenté par *d, se déroule sans déclencher d'erreur car l'objet référencé par d n'est pas requis.

Indirection via des pointeurs nuls et un comportement non défini

La norme C n'indique pas explicitement que l'indirection via un pointeur nul entraîne intrinsèquement un comportement indéfini. En fait, les numéros 232 et 315 du CWG suggèrent que la simple indirection n'est pas problématique.

Le principal argument en faveur de cette position réside dans l'existence de scénarios bien définis dans lesquels l'indirection via des pointeurs nuls est autorisée. Par exemple, [expr.typeid]/2 permet à typeid(*((A*)0)) de lever une exception bad_typeid, même si *d est évalué à null. Si une simple indirection invoquait UB, cette instruction ne serait pas bien définie.

Implications pour votre programme

Dans votre exemple,

<code class="cpp">int main()
{
    demo* d = nullptr;
    d->fun();
    std::cout << d->a;
    return 0;
}</code>

le programme se compile et s'exécute sans erreurs car l’appel de fonctions membres statiques ou l’accès à des variables statiques ne nécessite pas l’identité du référent. Votre programme ne présente donc aucun problème inhérent ni comportement indéfini.

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