初学c编程请教字符串操作段异常

初学c编程请问字符串操作段错误
void game_start()
  {
  char* g_sta_str;//大于玩家名字数组长度30的数组
  int g_sta_len;//用户输入昵称的长度
  printf(" 请输入你的昵称吧!\n");
  fflush(stdin);//
  scanf("%s",g_sta_str); 
   
  g_sta_len = strlen(g_sta_str);
  while (g_sta_len < 1 || g_sta_len > 30)
  {
  printf("你输入的昵称长度不合法 请重新输入!\n");
  printf("请输入你的昵称!\n");
   
  }
  printf("欢迎来到游戏 ^_^ %s\n",g_sta_str);
  g_player* p_ptr= (g_player*)malloc(sizeof(g_player)*2);  
  char* _p_tep_name = p_ptr -> p_name;
  while (*g_sta_str)
  {
  *_p_tep_name = *g_sta_str; 
  g_sta_str ++; 
  *_p_tep_name ++;  
   
  }
}

------解决方案--------------------
这里char* g_sta_str;实际上没分配内存
scanf("%s",g_sta_str);在这里就错了

scanf前面加上malloc给g_sta_str分配内存就不会出现段错误了
或者g_sta_str用数组
------解决方案--------------------
你用gdb调试一下,使用gdb可以定位到出现段错误的行。
while (g_sta_len < 1 || g_sta_len > 30)
{
printf("你输入的昵称长度不合法 请重新输入!\n");
printf("请输入你的昵称!\n");

}
你这儿的逻辑是不是有问题,当然这和段错误没关系,我想应该改成这样的吧:
while (g_sta_len < 1 || g_sta_len > 30)
{
printf("你输入的昵称长度不合法 请重新输入!\n");
printf("请输入你的昵称!\n");
scanf("%s",g_sta_str);
g_sta_len = strlen(g_sta_str);

}