Надо было привести проблемный код
прямо в вопросе
Проблема натурально вот тут:
char ** endptr;
long a = strtol(num, endptr, 10);
Исправление:
char * endptr;
long a = strtol(num, &endptr, 10);
Потому что strtol ждет указатель на место, куда надо записать указатель, а не
указатель вникуда, как вы написали. Передача же указателя вникуда приводит к UB - и программа падает даже не в том месте, где реально находится ошибка.