Rumah >pembangunan bahagian belakang >C++ >Adakah Memanggil Kaedah Melalui Penunjuk Null dalam Kelakuan Ditakrifkan C?

Adakah Memanggil Kaedah Melalui Penunjuk Null dalam Kelakuan Ditakrifkan C?

Susan Sarandon
Susan Sarandonasal
2024-10-27 18:40:30507semak imbas

 Is Calling a Method Through a Null Pointer in C   Defined Behavior?

Adakah Memanggil Kaedah Melalui Penunjuk Null Berfungsi dalam C ?

Sama seperti soalan pendua, mari kita periksa program C ini:

<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>

Di sini, kami memanggil kaedah show() pada penuding nol (ptr), yang menimbulkan persoalan: Adakah ini operasi yang sah?

Jawapannya

Memanggil kaedah melalui penuding nol bukan standard C dan dianggap tingkah laku tidak ditentukan. Walau bagaimanapun, sesetengah pengkompil mungkin mengoptimumkan kod ini untuk berjalan dengan cekap dengan melangkau semakan untuk penuding nol.

Sebabnya ialah kaedah ini sebenarnya tidak memerlukan penuding ini untuk melaksanakan kodnya. Pengkompil mengetahui jenis penuding, oleh itu ia boleh mencari kaedah dan menjalankan kodnya tanpa menyemak nilai penuding.

Walaupun tingkah laku ini mungkin mudah untuk sebab prestasi, adalah penting untuk menyedari bahawa ia bukan jaminan tingkah laku dan berbeza-beza merentasi penyusun dan sistem yang berbeza. Bergantung pada pengoptimuman ini boleh membawa kepada tingkah laku yang tidak dijangka dan salah dalam kod pengeluaran.

Oleh itu, sentiasa menjadi amalan terbaik untuk menyemak penunjuk nol sebelum menggunakannya, memastikan integriti dan kebolehramalan kod anda.

Atas ialah kandungan terperinci Adakah Memanggil Kaedah Melalui Penunjuk Null dalam Kelakuan Ditakrifkan 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