2011-06-25 10 views
-3

質問15.4の長さの計算:comp.lang.c FAQのエラー? variadicallyフォーマットされた文字列

len = strlen(first); 

va_start(argp, first); 

while((p = va_arg(argp, char *)) != NULL) 
    len += strlen(p); 

va_end(argp); 

しかし:そこのコード例でhttp://c-faq.com/varargs/varargs1.html

を、彼らはリストの最後に達した場合のva_argはNULLを返します考えているようですva_argのドキュメントで明示的にこれが当てはまるとは言えず、va_argはリストの最後を幸いに過ぎます。これは、上記のコードを模倣し、結果としてsegfaultを取得しようとする私の経験に同意します。

+0

-1完全な記事を読んでいないため – pmg

+0

私は理解します。私はC言語について新しいことを学ぶたびに、抵抗をやめると言語の美しさはさらに増します – Xamuel

+2

将来このスレッドを踏みにじる人のためのコメント:NULLを自動的に追加したい場合は(CPPを使用していると仮定します'#define myformatter(first、...)myformatter_(first、## __VA_ARGS__、NULL)' – Xamuel

答えて

2

実際には、va_argはリストのndにNULLを返すことについては言及していません。

ない次の引数が存在しない場合、または タイプは、実際の次の引数( デフォルト 引数キャンペーンに従って促進されるように)、発生する ランダムエラーの種類 と互換性がない場合。

しかし、よくある質問は言う:

vstrcatの呼び出しが、彼らは、発信者が信号の最後の引数としてNULLに合格すると仮定し意味

char *str = vstrcat("Hello, ", "world!", (char *)NULL); 

ようになりますリストの末尾

1

the c-faq articleで、呼び出されたかvstrcat、注:

char *str = vstrcat("Hello, ", "world!", (char *)NULL); 

最後のパラメータはNULLです。それはva_argが返すものです

2

彼らはvstrcat()の呼び出しでNULLポインタを渡しています。

A call to vstrcat looks something like 

    char *str = vstrcat("Hello, ", "world!", (char *)NULL); 
関連する問題