asprintf() (Was: strcpy, strlcpy.)
新城@筑波大学情報です。こんにちは。
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() 忘れるとメモリ・リー
クになってしまうということでしょうか。
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735