Everytime tsk_home_dir is called it allocates a new string. Who
must free this memory? C or Scheme?

From the gambit-c manual : Any C string type passed to the Scheme environment causes the creation of a fresh Scheme string containing a copy of the C string...