#include <stdio.h>
int main(void)
{
typedef char * string;
string first_name;
string last_name;
scanf("%s %s", first_name, last_name);
printf("%s %s", last_name, first_name);
return 0;
}
// А так работает
char first_name[40];
char last_name[40];
char first_name[40] - резервируется память для 40 байт.
typedef char * string;
string first_name; - это просто указатель, причем неинициализированный.
scanf("%s %s", first_name, last_name); - это обращение
к неинициализированному указателю (undefined behaviour)