itoa() 関数が void を返し、char[] を返す代わりに、渡された char[] 配列に結果を格納する理由はありますか?
3 に答える
その理由は、関数は呼び出し元がバッファーを割り当てて提供することを期待しているためです。これは C では非常に標準的です。関数が新しいバッファーを返した場合、呼び出し元はその割り当てを解除する必要があり、バッファーが動的に割り当てられるように強制されます。呼び出し元にバッファーを提供するように要求することにより、関数はバッファーを自動ストレージで割り当てるか、動的に割り当てることができます。
itoa
実際、私がよく知っているのバージョンは、 return ではなく、呼び出し元が提供したバッファを実際に返しvoid
ます。
AC 関数は配列を返すことができません。
C 関数が配列を返すのと同じことを行う方法はいくつかあります。それらのどれもきれいではありません。
- 呼び出し元は、配列の大きさの指示と共に、配列の最初の要素へのポインターを渡すことができます。呼び出し元は、ポイント先の配列を埋めることができます。これには、呼び出し元がどのくらいのスペースが必要になるかを判断する必要があります。
- 関数は
static
配列を定義し、その最初の要素へのポインターを返すことができます。これには、コンパイル時に配列のサイズを固定する必要があります。また、連続して呼び出すと配列が破壊されることも意味します。 - この関数は、 を使用して配列を割り当て、
malloc()
その最初の要素へのポインターを返すことができます。これは最も柔軟なアプローチですが、呼び出し元はfree()
バッファーの割り当てを解除するために呼び出す責任があり、割り当ての失敗を処理する準備も必要です。
どうやらitoa()
関数の設計者はオプション 1 を選択したようです。
さらに、itoa()
ISO C 標準または POSIX によって定義された関数はありません。一部のCランタイムライブラリでは拡張機能として定義されているようですが、私が試したいくつかのシステム (Solaris および Linux のいくつかのフレーバー) では存在しません。移植性が気になる場合は、整数を文字列に変換する別の方法を見つけることをお勧めしsprintf
ますsnprintf
。