always reserve room for trailing '\0'