Есть такой быдлокод
commandlet* cmdlet_search(char* command)
{
  DEBUG("cmdlet_search(): finding \"%s\"\n", command);
  int i;
  for(i = 0; cmdlist[i] != 0; i++)
    {
      if(!strcmp(command, cmdlist[i]->cmd))
	{
	  DEBUG("cmdlet_search(): found! (-> %s at %p on %p)\n", cmdlist[i]->cmd, &cmdlist[i]->cmd, cmdlist[i]);
	  return cmdlist[i];
	}
    }
  DEBUG("cmdlet_search(): not found!\n");
  return 0;
}
int cmd_shell(char *cmdshell) //NOTE: 1 - commandlet not found
{
  //void* (*callback)();
  int flag;
  commandlet* cmdl = 0;
  flag = extractcmd(cmdshell);
  cmdl = cmdlet_search(cmdshell);
  if(cmdl == 0)
    return 1;
  DEBUG("cmdl is %p now\n", cmdl);
  DEBUG("Running command from %s\n", cmdl->cmd);
  if(!flag)
    cmdl->callback();
  else
    cmdl->callback(&cmdshell[strlen(cmdshell)+1]);
  debug_cmds_bt();
  return 0;
}
После ввода команды в программе должен вызываться cmd_shell(«имя_команды»), который должен вызвать cmdlet_search, который ищет структуру, где есть введённая команда и указатель на функцию для вызова. Предположим, нужно найти команду принт
Shell> print hello
cmdlet_search(): finding "print"
cmdlet_search(): found! (-> print at 0x804c1a100 on 0x804c1a100)
cmdl is 0x4c1a100 now
zsh: segmentation fault (core dumped)
Почему адреса не совпадают? Алсо, код выглядит далеко не лучшим образом. Скажем, вместо цикла надо юзать хештейбл, но пока что я решил обойтись циклом. Не обращайте на это внимание и скажить в чём трабла конкретно с этой проблемой.






