Ну смотри, в сишке все что в одинарных скобочках это символ.
Каждый символ это int.
8$ это не валидный символ, поэтому компилятор си отбрасывает $ и получает просто '8'. Это 56.
В итоге мы получаем char *s = 112. Неявно кастуем это к указателю и получаем строку по адресу 112 в памяти.
Потом puts это делает сисвызов, ложит 112 на стэк как указатель на строку, которую надо вывести.
Ядро смотрит, что такого указателя программе не выдали роняет ее с SEGFAULT