Как вы вызываете эту функцию и как распределяется buf? Помните, что buf не может быть доступен только для чтения или const (strtok изменяет входной буфер при вызове).
Это работает, потому что х можно изменить:
char x[] = "das sdg hfg jgh";
char *c = ParseCmdX(x, strlen(x));
Это, однако, ошибки сегмента:
char *y = "das sdg hfg jgh";
char *c = ParseCmdX(y, strlen(y));