Ну как минимум вы ничем не инициализируете test.tochar в "конструкторе", но используете этот указатель в printf, это вызывает вылет программы без вызова _point_tochar.
Вычисление адреса объекта (self) вы так не сделаете. Я в принципе могу догадаться, что вы пытались сделать, но это выполнено явно не правильно. И это даже может дать правильный результат, если правильно реализовать. Но любое изменение в стеке приведет к тому, что "формулу" придется переделывать. А стек меняется при каждом вызове и возврате из функции, при каждом объявлении локальной переменной, т.е. очень часто.
Так что адрес объекта передавайте явно в функцию.
В
"Экстремальный Си" описывается подход к ООП на Си.