Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah ia dibenarkan untuk mengakses ahli statik menggunakan penuding nol dalam C ?

Mengapakah ia dibenarkan untuk mengakses ahli statik menggunakan penuding nol dalam C ?

Susan Sarandon
Susan Sarandonasal
2024-11-03 01:33:02884semak imbas

Why is it allowed to access static members using a null pointer in C  ?

Mengakses Ahli Statik Menggunakan Penunjuk Null dalam C

Konteks

Pertimbangkan program berikut:

<code class="cpp">#include <iostream>
class Demo
{
public:
    static void func() { std::cout << "func() called" << std::endl; }
    static int num = 9;
};

int main()
{
    Demo* d = nullptr;
    d->func();
    std::cout << d->num << std::endl;
    return 0;
}

Soalan

Atur cara ini menyusun dan berjalan tanpa ralat, manakala mengakses ahli statik melalui penuding nol secara amnya dianggap kelakuan tidak ditentukan. Mengapa ini dibenarkan?

Jawapan

TL;DR:

Program yang diberikan tidak mencetuskan tingkah laku yang tidak ditentukan kerana arahan melalui penuding nol tidak sememangnya bermasalah melainkan ia melibatkan operasi selanjutnya yang bergantung pada identiti objek yang sah.

Penjelasan:

Sama ada acuan melalui penunjuk nol adalah tingkah laku yang tidak ditentukan secara intrinsik telah menjadi perdebatan. . Satu-satunya operasi yang boleh dipersoalkan dalam program ini ialah penilaian ungkapan d->a.

d->a adalah bersamaan dengan (*d).a disebabkan oleh peraturan penyahrujukan penunjuk. Walau bagaimanapun, walaupun *d tidak ditakrifkan, ungkapan *d masih dinilai, terutamanya apabila keputusannya dibuang, seperti dalam kes d->a. Tingkah laku ini ditakrifkan dengan baik.

Tingkah laku dengan ahli statik adalah berbeza daripada mengakses ahli bukan statik melalui penuding nol, yang sepatutnya mencetuskan gelagat yang tidak ditentukan kerana ia menunjukkan identiti objek yang tidak sah. Mengakses ahli statik, sebaliknya, tidak memerlukan identiti objek dan tingkah laku mereka ditakrifkan secara eksplisit dalam standard.

Pertimbangan Tambahan

  • Isu CWG #232 menyerlahkan percanggahan antara rawatan mengarah melalui penunjuk nol dalam piawaian C, menunjukkan bahawa ia mungkin tidak membawa kepada tingkah laku yang tidak ditentukan.
  • Isu CWG #315 secara khusus menangani senario menggunakan fungsi ahli melalui penuding nol, mengulangi bahawa alihan itu sendiri adalah bukan ralat melainkan ia melibatkan operasi selanjutnya yang bergantung pada identiti objek.
  • Membuang hasil ungkapan (ungkapan nilai dibuang) dilayan secara berbeza daripada mengakses nilai, yang mungkin mencetuskan ralat bergantung pada konteks.

Kesimpulan

Program yang diberikan tidak mendatangkan sebarang bahaya kerana penilaian *d dibenarkan dalam konteks mengakses ahli statik. Arahan melalui penunjuk nol sahaja tidak semestinya menyebabkan tingkah laku yang tidak ditentukan, tetapi adalah penting untuk mengetahui potensi risiko yang berkaitan dengan operasi selanjutnya yang memerlukan identiti objek.

Atas ialah kandungan terperinci Mengapakah ia dibenarkan untuk mengakses ahli statik menggunakan penuding nol dalam C ?. 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