I think what you want is to append not copy. I'm not sure, but if I remember correctly copy will overwrite any previous value. You could use simply concatenation I believe, like this:
fullName = firstName + " " + lastName;
The reason you are getting the funky output for name though is that you are using fullname as your output. Since you fullName array is declared as having size 20, it has elements from 0 to 19. 20 is outside the array. Also, remember that the array is an array of characters, so trying to output a single element of the array will only display a single character. To output the entire array simply use fullName.
Edit: Actually, <cstring> has a function called strcat that should work for you too.
Make sure your 'lastName' array actually contains a name and isn't empty.
EDIT: ah, yes... that's the culprit:
1 2 3 4
cin >> age; // using the >> operator leaves the newline in the buffer
cout << "Enter your last name: " << endl;
cin.getline(lastName, 10); // so this returns immediately with an empty string
This is one of the many reasons I hate using iostream. It's super confusing and filled with these kinds of gotchas. I still don't fully understand how it all works. Anyway, you might be able to fix this by moving the ignore() call so it's ABOVE the getline(lastName call.