Adakah "&s[0]" Merujuk Aksara Bersebelahan dalam std::string?
Dalam C , menggunakan "&s[0] " untuk mengakses aksara pertama std::string telah menjadi amalan biasa, tetapi timbul kebimbangan mengenai keselamatannya dalam konteks ini. Memahami skema storan asas std::string adalah penting untuk menangani isu ini.
Piawaian C 98/03 tidak menguatkuasakan storan bersebelahan untuk peruntukan std::string, membolehkan pelaksanaan menggunakan memori berpecah-belah . Walau bagaimanapun, dengan kemunculan C 11, storan bersebelahan menjadi keperluan wajib untuk std::string.
Dalam praktiknya, sangat tidak mungkin untuk menghadapi pelaksanaan yang menyimpang daripada pendekatan storan bersebelahan. Seperti yang diakui oleh Herb Sutter, tiada pelaksanaan yang diketahui melanggar konvensyen ini.
Oleh itu, menggunakan "&s[0]" untuk merujuk aksara pertama std::string adalah selamat dalam kedua-dua C 98/03 dan C 11. Piawaian C 11 secara jelas menjamin kelakuan ini, walaupun untuk rentetan panjang sifar. Ini terbukti daripada takrif operator[]:
Returns: *(begin() + pos) if pos < size(), otherwise a reference to an object of type T with value charT(); the referenced value shall not be modified
Selain itu, fungsi data() ditakrifkan sebagai:
Returns: A pointer p such that p + i == &operator[](i) for each i in [0, size()].
Takrifan ini mengesahkan bahawa rujukan yang diperoleh melalui "&s [0]" menunjuk kepada aksara yang sah dalam rentetan, yang bersebelahan secara lalai dalam pelaksanaan C moden.
Atas ialah kandungan terperinci Adakah `&s[0]` Cara Selamat untuk Mengakses Aksara Pertama std::string dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!