Есть такой быдлокод
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)
Почему адреса не совпадают? Алсо, код выглядит далеко не лучшим образом. Скажем, вместо цикла надо юзать хештейбл, но пока что я решил обойтись циклом. Не обращайте на это внимание и скажить в чём трабла конкретно с этой проблемой.