Walaupun jangkaan ralat yang kelihatan intuitif, kaedah memanggil kaedah melalui penunjuk nol dalam C mungkin kelihatan dilaksanakan. Tingkah laku ini menimbulkan persoalan mengenai pematuhan standard dan amalan pengoptimuman yang digunakan oleh penyusun.
Untuk menyelidiki perkara ini, pertimbangkan contoh berikut:
<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>
Dalam coretan ini, ujian kelas ditentukan dengan kaedah pembina dan show(). Dalam fungsi main(), ptr penunjuk dimulakan kepada NULL dan kemudian kaedah show() digunakan melalui ptr.
Anehnya, program ini dilaksanakan tanpa ralat dan mencetak "show fun called" tanpa mencetuskan pembina . Ini disebabkan oleh fakta bahawa dalam C , pengkompil mengetahui jenis penuding nol, membolehkannya mengenal pasti kod kaedah. Memandangkan kaedah show() tidak menggunakan penunjuk ini, ia berjalan dengan jayanya.
Walau bagaimanapun, tingkah laku ini dianggap tidak ditentukan dalam piawaian C. Penyusun dibenarkan untuk mengoptimumkan kod dengan tidak menyemak sama ada penunjuk adalah NULL sebelum memanggil kaedah. Walaupun pengoptimuman ini meningkatkan kecekapan, ia menjejaskan keselamatan dan kebolehramalan.
Atas ialah kandungan terperinci Mengapa Menggunakan Kaedah Melalui Penunjuk Null dalam C Kadangkala Berfungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!