新城@筑波大学情報です。こんにちは。

In article <c2hsnp$18oi$1@nsvn01.zaq.ne.jp>
        shirai@unixusers.net (Takashi SHIRAI) writes:
>  しらいです。
> >asprintf() って何ですか?
>  こんなの(↓)です。
> http://www.linux.or.jp/JM/html/LDP_man-pages/man3/asprintf.3.html

あ。うちの Linux に入ってない。と思ったけど、man に出てこな
いだけか。Libc には入っています。Solaris には入っていないか。

>  内部で malloc() を呼ぶことで、format 文字列を展開した後に
> 必要となる buffer を動的に確保してくれる形式の printf() 関数
> です。
>  snprintf() と違って、buffer size を指定する必要すらないた
> め、library bug さえ無ければこの関数内で buffer overflow は
> 起こり得ません。

意味的には、こんな感じですか。

asprintf(char **ret, const char *format, ...)
{
        size = snprintf(0,format, ...) + 1 ;
        p = malloc( size );
        snprintf( p,size, format, ... );
        *ret = p ;
        return( size );
}

2回 snprintf() するのは、重たいのでやってないのでしょうけど。

asprintf() は、malloc() するスタイルに合えば、いいですね。
read() のスタイルとは少し違います。read() だと、呼出し側がメ
モリを確保します。

Perl とか Ruby とかインタプリタでやると、asprintf() みたいな
感じになっちゃうんですかね。

あと、asprintf() の問題としては、free() 忘れるとメモリ・リー
クになってしまうということでしょうか。

\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報       \\