>>807
確かに、url_encode()内で文字列長を調べ、必要なメモリサイズを計算し、
メモリを確保してそこへ書き込み、確保したアドレスを返すことは可能です。

しかし、例えば非常に短い間しか必要としない場合、わざわざmallocして
解放漏れのないようコーディングするより、スタック上で済ませた方が
楽チンだったりもします。
また、返って来たアドレスは本当にmallocされたものでしょうか?
staticな変数として関数内に確保されていない、という保証を誰が約束して
くれるのでしょうか?今のバージョンではmallocされていたとして、将来の
バージョンでもmallocされ続ける保証は?

そんなわけで、この手の関数ではバッファの確保を呼び出し側の責任と
する場合が多いです。
そして、確保されたバッファを越えて書き込んで(バッファオーバーフロー)
しまわないよう、何バイトまでなら書き込んでもいいのか、引数として受け取る
という仕様になります。