Beh ... sì, ci sono degli errori ... e' "grave" soprattutto questo

*st = *st - '0';

che modifica la stringa di partenza ...

Piuttosto penserei a questo

codice:
int foo (char *st)
{
   int l, res=0;
   for(l=0; *(st+l); l++)
   {
     res *= 10;
     res += *(st+l)-'0';
   }

   return res;
}
escludendo ovviamente il codice di controllo del contenuto della stringa (dando per scontato che la stringa sia una sequenza di cifre ...).

P.S. Pero' la scrittura di una atoi personalizzata e' OT in questo caso ...