Mengapa Menggunakan Kaedah Melalui Penunjuk Null dalam C Kadangkala Berfungsi?

Mary-Kate Olsen
Lepaskan: 2024-11-01 02:27:27
asal
921 orang telah melayarinya

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!