pesky pointer problems...

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