Вы не можете изменять строковые константы, это неопределенное поведение в соответствии со стандартом.
Если вы замените:
char *text = (char *)"HI";
на что-то вроде:
char text[3];
strcpy (text, "HI");
или:
char text[] = "HI";
вы обнаружите, что это будет работать, потому что text
в этом случае является модифицируемой памятью.