Rumah >pembangunan bahagian belakang >C++ >Mengapa Menggunakan Kaedah Melalui Penunjuk Null dalam C Kadangkala Berfungsi?

Mengapa Menggunakan Kaedah Melalui Penunjuk Null dalam C Kadangkala Berfungsi?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-01 02:27:271020semak imbas

Why Does Invoking a Method Through a Null Pointer in C   Sometimes Work?

Memahami Tingkah Laku Tidak Ditakrifkan: Seruan Kaedah Penunjuk Null dalam C

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!

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