std::string에서 연속 문자에 액세스
C에서 다음 코드를 만날 수 있습니다.
std::string s; s.resize(strLength); memcpy(&s[0], str, strLength); // Is this safe?
&s[0]을 사용하는 것은 std::Vector에서는 안전하지만 std::string에서의 사용은 우려를 불러일으킵니다. 이 기사에서는 제시된 코드의 안전성을 검토합니다.
C 98/03에서는 std::string 할당이 연속적이라는 보장이 없었습니다. 그러나 C 11은 연속성을 요구합니다. 실제로 알려진 모든 구현은 연속 저장소를 사용합니다.
또한 C 11 표준은 빈 문자열에 대해서도 &s[0]의 안전성을 보장합니다. 이는 std::string의 연산자[]가 다음과 같이 정의되어 있기 때문입니다.
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]에 액세스하는 것은 정의되지 않은 동작이었습니다. 그러나 이 문제는 이후 표준 초안에서 해결되었습니다.
위 내용은 `&s[0]`을 사용하여 std::string의 연속 문자에 액세스하는 것이 C에서 안전합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!