Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah char* Alias ​​Penunjuk Objek Lain tetapi Bukan Sebaliknya?

Mengapakah char* Alias ​​Penunjuk Objek Lain tetapi Bukan Sebaliknya?

Susan Sarandon
Susan Sarandonasal
2024-11-12 08:52:02862semak imbas

Why Can a char* Alias Other Object Pointers but Not the Other Way Around?

Mengapa Peraturan Aliasing Ketat Membenarkan char* kepada Alias ​​Penunjuk Objek Lain

Peraturan alias yang ketat, seperti yang dinyatakan dalam jawapan yang diterima untuk " Apakah peraturan aliasing yang ketat?", menyatakan bahawa penunjuk jenis berbeza mungkin tidak digunakan untuk mengakses lokasi memori yang sama. Walau bagaimanapun, pengecualian kepada peraturan ini wujud untuk char*.

Pengecualian Aliasing untuk char*

Walaupun peraturan alias yang ketat, ia dibenarkan menggunakan char kepada alias penunjuk mana-mana jenis objek lain. Ini mungkin kerana char boleh mengakses memori di mana-mana alamat dengan butiran bait tunggal. Oleh itu, char* boleh membaca dengan betul bait yang menyusun objek daripada apa-apa jenis lain.

Pengalian Sehala

Pengecualian pengalian untuk char ialah sehala. Ini bermakna walaupun char boleh alias penunjuk bagi mana-mana jenis objek lain, sebaliknya adalah tidak benar. Penunjuk jenis objek lain, seperti struct something, tidak boleh digunakan untuk alias char.

Sebab bagi Asimetri

Sebabnya kerana asimetri ini terletak pada potensi rasuah data. Jika penunjuk jenis objek lain dibenarkan untuk alias char, adalah mungkin untuk membaca bait char menggunakan peraturan penjajaran yang lebih permisif bagi penunjuk objek. Ini boleh membawa kepada tingkah laku yang tidak dapat diramalkan dan tidak betul, kerana bait char* mungkin tidak diselaraskan dengan betul untuk jenis objek.

Contoh

Untuk menggambarkan pengecualian, pertimbangkan contoh berikut:

char* charptr;
struct something* structptr;
charptr = (char*) structptr; // Allowed
structptr = (struct something*) charptr; // Not allowed

Dalam contoh ini, ia dibenarkan untuk menetapkan nilai structptr kepada charptr kerana charptr boleh alias bait struct dengan selamat. Walau bagaimanapun, tugasan yang bertentangan tidak dibenarkan, kerana structptr tidak boleh mengakses bait char* dengan betul dengan peraturan penjajaran yang lebih ketat.

Atas ialah kandungan terperinci Mengapakah char* Alias ​​Penunjuk Objek Lain tetapi Bukan Sebaliknya?. 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