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
Lepaskan: 2024-12-05 02:57:09
asal
999 orang telah melayarinya

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?
Salin selepas log masuk

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
Salin selepas log masuk

Selain itu, data() ditakrifkan sebagai:

Returns: A pointer p such that p + i == &amp;operator[](i) for each i in [0, size()].
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan