ジャンル不定の日記です。

iconv関数の引数がポインタのポインタなわけ

mingwでWindowsアプリ作ってるんだが、
C言語初心者だからかも知れんが、文字コード変換のiconv()の引数がポインタのポインタになってて、リファレンスだとポインタ自体を変更するって書かれてて謎だったが、理解できた。

iconv()の引数がポインタのポインタなのはポインタの指すアドレス自体を変更するからなわけで、
そんなことしたら呼び出し元で文字列の参照ができなくなって困らん?
と最初思ってたんだが、
実際に使ってみると困ったことになってなかったんだが、iconv()を使う自前関数にポインタを渡して、そこからiconv()にポインタのポインタを渡して使ってたから呼び出し元のポインタアドレスは変わってなかったってことね。
iconv()はそんな感じでメインルーチンで直接使わずに専用関数にポインタを渡して、そこからiconv()にポインタのポインタを渡すのが正解ね。

で、なんでこんな仕様になってるのかってのは、
変換できない文字が出現した際にiconvがそこで止まって文字列ポインタのアドレスがエラー発生箇所に移動しててカウンタ変数も書き換えられてるから、
エラー文字を?に変換するとかの処理が簡単に作れるのね。