Если вы используете C ++ 0x, то гарантированно будет работать следующее:
std::string s;
s.resize(max_length);
size_t actual_length = SomeApiCall(&s[0], max_length);
s.resize(actual_length);
До C ++ 0x содержимое std :: string не гарантируется быть последовательным в памяти, поэтому код не является надежным в теории; на практике это работает для популярных реализаций STL.