訪問std::string 中的連續字元
C 中可能會遇到以下程式碼:
std::string s; s.resize(strLength); memcpy(&s[0], str, strLength); // Is this safe?
雖然在std::vector 中使用&s[0] 是安全的,但在std::string中使用它會引起擔憂。本文檢查了所提供程式碼的安全性。
在 C 98/03 中,不保證 std::string 的分配是連續的。然而,C 11 要求連續性。實際上,所有已知的實作都使用連續儲存。
此外,C 11 標準保證 &s[0] 的安全,即使對於空字串也是如此。這是因為std::string 的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
此外,data() 定義為:
Returns: A pointer p such that p + i == &operator[](i) for each i in [0, size()].
因此, &s[0] 提供指向字串首字符的有效指針。
注意: 在標準化之前,存取&s[0] 對於空字串是未定義的行為。不過,這個問題已在後來的標準草案中解決。
以上是在 C 中使用 `&s[0]` 存取 std::string 中的連續字元安全嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!