Mengakses Aksara Bersebelahan dalam std::string
Seseorang mungkin menemui kod berikut dalam C :
std::string s; s.resize(strLength); memcpy(&s[0], str, strLength); // Is this safe?
Semasa menggunakan &s[0] selamat dalam std::vector, penggunaannya dalam std::string menimbulkan kebimbangan. Artikel ini mengkaji keselamatan kod yang dibentangkan.
Dalam C 98/03, peruntukan std::string tidak dijamin bersebelahan. Walau bagaimanapun, C 11 mewajibkan keterkaitan. Dalam amalan, semua pelaksanaan yang diketahui menggunakan storan bersebelahan.
Selain itu, standard C 11 menjamin keselamatan &s[0], walaupun untuk rentetan kosong. Ini kerana operator[] untuk std::string ditakrifkan sebagai:
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, data() ditakrifkan sebagai:
Returns: A pointer p such that p + i == &operator[](i) for each i in [0, size()].
Oleh itu, &s[0] menyediakan penunjuk yang sah kepada aksara awal rentetan.
Nota: Sebelum penyeragaman, mengakses &s[0] untuk rentetan kosong ialah tingkah laku yang tidak ditentukan. Walau bagaimanapun, ini telah diselesaikan dalam draf standard kemudian.
Atas ialah kandungan terperinci Adakah Mengakses Aksara Bersebelahan dalam std::string Menggunakan `&s[0]` Selamat dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!