Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bolehkah Anda Mengakses Ahli Statik dalam C Menggunakan Penunjuk Null Tanpa Kelakuan Tidak Ditakrifkan?

Bolehkah Anda Mengakses Ahli Statik dalam C Menggunakan Penunjuk Null Tanpa Kelakuan Tidak Ditakrifkan?

Barbara Streisand
Barbara Streisandasal
2024-11-02 11:53:03177semak imbas

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

Mengakses Ahli Statik Menggunakan Penunjuk Null dalam C

Dalam C , ahli statik kelas boleh diakses melalui penuding nol tanpa menggunakan gelagat yang tidak ditentukan. Tingkah laku ini, yang mungkin kelihatan mengejutkan, boleh dijelaskan dengan meneliti definisi dan rasional bahasa.

Penilaian Penunjuk Tidak Dimulakan

Apabila mengakses ahli kelas melalui penuding nol, tingkah lakunya adalah baik- ditakrifkan selagi penilaian operan tidak memerlukan identiti rujukan atau nilai tersimpan. Contohnya, mengakses pembolehubah ahli statik d->a hanya menilai ungkapan *(d) untuk mendapatkan rujukan kepada objek, tetapi tidak melakukan operasi yang memerlukan rujukan dimulakan.

Penilaian ini proses disokong oleh [expr.ref]/2, yang menyatakan bahawa d->a ditukar kepada ((d)).a. Penilaian ((d)), yang diwakili oleh *d, diteruskan tanpa mencetuskan sebarang ralat kerana objek yang dirujuk oleh d tidak diperlukan.

Arah Melalui Penunjuk Null dan Kelakuan Tidak Ditakrifkan

Piawaian C tidak menyatakan secara eksplisit bahawa acuan melalui penuding nol sememangnya menghasilkan tingkah laku yang tidak ditentukan. Malah, isu CWG #232 dan #315 mencadangkan bahawa penyimpangan semata-mata tidak bermasalah.

Hujah utama pendirian ini terletak pada kewujudan senario yang ditakrifkan dengan baik di mana penyimpangan melalui penunjuk nol dibenarkan. Sebagai contoh, [expr.typeid]/2 membenarkan typeid(*((A*)0)) membuang pengecualian bad_typeid, walaupun *d menilai kepada null. Jika UB secara tidak langsung digunakan, kenyataan ini tidak akan ditakrifkan dengan baik.

Implikasi untuk Program Anda

Dalam contoh anda,

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

program menyusun dan berjalan tanpa ralat kerana menggunakan fungsi ahli statik atau mengakses pembolehubah statik tidak memerlukan identiti rujukan. Oleh itu, program anda tidak mempunyai sebarang isu yang wujud atau tingkah laku yang tidak ditentukan.

Atas ialah kandungan terperinci Bolehkah Anda Mengakses Ahli Statik dalam C Menggunakan Penunjuk Null Tanpa Kelakuan Tidak Ditakrifkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn