To be more technical a local variable in C has local scope and dynamic extent - it ceases to exist when the enclosing function returns. Put another way C doesn't support closures (with closures all variables have indefinite extent - they exist for as long as they are referenced).
You could rewrite that function this way using pass-by-reference:
bool ConfigMan::getPhone (byte num, char* &crewPhone)
{
crewPhone= getPhone (num);
or even using explicit pointers:
bool ConfigMan::getPhone (byte num, char* *crewPhone)
{
*crewPhone= getPhone (num);
However the more elegant solution to your actual problem is to realise that you can return a null pointer from getPhone() to indicate no-match - just have the original getPhone () go "return (char*) 0 ;" if no match found
if (crewPhone = getPhone (num))
{
// there was a result, so process it
}
null ponters have the value zero, zero can be cast to any pointer type. "NULL" may already be #defined to 0