groupName2 = malloc(strlen(groupName + 2)); Странная конструкция,

groupName2 = malloc(strlen(groupName + 2));

Странная конструкция, для ф-ии strlen дается строка groupName начиная с 3-го символа. А если в groupName лежит строка длиной в 1 символ? Тогда strlen попрет по памяти в поисках 0, возможно найдет его где-то, и возвратит какое-то число, именно на это число байт и попытается выделить память malloc.
Верный вариант конечно этот:
groupName2 = malloc(strlen(groupName) + 2);