可変長引数に関する質問です(bcc32 and vs2005)

void mprintf(const char*str,...)
{
char tmp[256];
va_list ap;
static int i=0;

va_start(ap,str);
vsprintf(tmp,str,ap);
sprintf(tmp,"%d,%s",i++,tmp);
printf("%s",tmp);
va_end(ap);
}

上記の関数を定義しmprintf()を任意の引数で呼び出すと、printfで出力する
ところの%s部分、tmpが表示されないです。若しくはバグってしまいます。
デバッガでtmpの内容を確認してみると、ゴミが混入しているらしいのですが、
どこか使い方間違っていますでしょうか?