質問です

可変長引数の関数(void var_arg_func(int n, ...))をつくって、
    var_arg_func(99, "call", "with", "five", "arguments");
と呼び出して、関数内で
    va_list ap;
    char *s
    va_start(ap, n)
    while( s = va_arg(ap, char*))
        puts(s);
    va_end(ap);
というふうにして引数を表示させると、動作はするんですが
最後にBus Errorが出ました。
    var_arg_func(44, "arg2", "arg3", NULL);
と呼び出せばうまくいくんですが、あんまり気持ちよくないです。
呼び出し側から、引数にそのときの引数の数を入れるのもあまり
スマートじゃない感じがします。
こういうとき、関数の中から実際に渡された引数の数を知る方法
はありますか?
それか、うまく終了判定する方法はありますか?