Alamat Anomali Paparan Data Char
Dalam atur cara yang mengandungi kelas dengan ahli data pelbagai jenis, int, aksara dan rentetan, pemerhatian yang tidak dijangka muncul apabila mencetak alamat ahli data ini. Semasa alamat int dan rentetan dipaparkan, alamat ahli data char kelihatan kosong.
Untuk menyelesaikan isu ini, pertimbangkan perwakilan asas jenis data char. Apabila anda memperoleh alamat pembolehubah char menggunakan operator &, anda memperoleh penunjuk ke char. Walau bagaimanapun, pengendali sisipan strim (<<) mentafsirkan penuding ini sebagai rentetan penamatan nol gaya C. Akibatnya, ia cuba mencetak rentetan yang dikaitkan dengan penuding, yang tidak wujud dalam kes ini.
Untuk membetulkan gelagat ini, hantar alamat pembolehubah char secara eksplisit ke penuding kosong menggunakan static_cast. Dengan berbuat demikian, anda mengarahkan pengendali sisipan strim untuk mentafsir nilai sebagai alamat dan bukannya rentetan.
<br>cout << "alamat char :" << static_cast<void *>(&b) << endl;<br>
Selain itu, apabila ahli data kelas diisytiharkan awam, sesuatu yang menarik berlaku. Alamat pembolehubah aksara kini dipaparkan, tetapi dengan ofset 8 bait berbanding dengan alamat pembolehubah int.
<br> ... int : sesuatu <br> .. . char : something_2<br> ... rentetan : something_3<br>
Menariknya, something_2 - sesuatu sentiasa 8. Ini berasal daripada padding yang digunakan pada ahli kelas untuk susun atur memori yang cekap. Pembolehubah aksara, walaupun hanya menduduki 1 bait, diperuntukkan 4 bait kerana keperluan penjajaran. Pelapik 3-bait ini mencipta offset yang diperhatikan.
Atas ialah kandungan terperinci Mengapakah Mencetak Alamat Ahli Char dalam Kelas Kadang-kadang Kelihatan Kosong, dan Mengapa Terdapat Offset 8 Bait Apabila Tidak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!