You've got a couple of problems there:
- There's no guarantee that string::c_str() returns a pointer to string's own buffer - it's allowed to create a new buffer and only fill it with the chars up to the first '\0;
- Even if it did, there's no guarantee that the internal buffer occupies contiguous storage.
In practice, I can't see number 1 being too much of a problem (it could run into problems with ownership of the new buffer), but number 2 is potentially a killer.
However, you're correct that string, properly used (i.e. use c_str() sparingly and only when really needed), seems to meet the OP's requirements.