Mengakses Aksara melalui "&s[0]" dalam std::string
Dalam C , kelas std::string menyediakan cara mudah untuk memanipulasi urutan aksara. Walau bagaimanapun, perwakilan asas data rentetan mungkin berbeza bergantung pada pelaksanaan, yang membawa kepada persoalan tentang keselamatan ingatan.
Soalan:
Adakah menggunakan "&s[0]" untuk akses aksara dalam std::string menjamin memori bersebelahan peruntukan?
Jawapan:
Di bawah piawaian C 98/03, peruntukan memori std::string tidak ditakrifkan secara eksplisit, menyerahkannya kepada pelaksanaan . Walau bagaimanapun, piawaian C 11 mewajibkan storan bersebelahan untuk objek std::string.
Dalam amalan, kebanyakan pelaksanaan, sebelum dan selepas penyeragaman C 11, telah menggunakan storan bersebelahan untuk std::string. Ini bermakna penggunaan "&s[0]" untuk mengakses aksara secara amnya dianggap selamat.
Akses Dijamin Standard:
Menurut piawaian C 11, pengendali[ ] for std::string sentiasa menjamin akses kepada rujukan aksara yang sah. Walaupun dalam kes di mana rentetan kosong, "&s[0]" ditakrifkan untuk menunjuk ke objek dengan nilai charT(), memastikan ia kekal sebagai rujukan memori yang sah.
Ini diperkukuh lagi oleh definisi data() untuk std::string, yang menyatakan bahawa penunjuk "p" yang dikembalikan harus merujuk lokasi memori berturut-turut yang sepadan dengan elemen yang boleh diakses melalui "&operator[](i)" dalam julat yang sah [0,size()].
Nota Sejarah:
Dalam versi terdahulu piawai C 0x, gelagat "&s[0] " dengan rentetan panjang sifar tidak ditentukan. Walau bagaimanapun, prapestandardisasi C 0x dan draf piawai seterusnya telah menjelaskan tingkah laku ini, menjamin bahawa "&s[0]" menunjuk kepada rujukan memori yang sah dalam semua kes.
Atas ialah kandungan terperinci Adakah `&s[0]` Menjamin Peruntukan Memori Bersebelahan dalam C `std::string`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!