Including the final (char *)NULL is the responsibility of the caller