user-allocated zstrings are assumed to be large enough