Those are called "length prefixed strings", or more simply "Pascal strings". The difficulty is one has to reallocate and copy to represent a substring.
Having a pointer in the struct allows you to increase the string's capacity without changing all the references to it.