Rumah >pembangunan bahagian belakang >C++ >Adakah Mengakses Aksara Bersebelahan dalam std::string Menggunakan `&s[0]` Selamat dalam C ?

Adakah Mengakses Aksara Bersebelahan dalam std::string Menggunakan `&s[0]` Selamat dalam C ?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-05 02:57:091019semak imbas

Is Accessing Contiguous Characters in std::string Using `&s[0]` Safe in C  ?

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 == &amp;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!

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