8

C で文字列を返すメソッドを作成する際に、より良い方法と見なされるものは何ですか?

バッファとサイズを渡す:

void example_m_a(type_a a,char * buff,size_t buff_size)

または、適切なサイズの文字列を作成して返します。

char * example_m_b(type_a a)

PS割り当てスタイルとネストされた関数呼び出しを許可するためにバッファptrを返すことについてどう思いますか

char * example_m_a(type_a a,char * buff,size_t buff_size)
{
...
return buff;
}
4

5 に答える 5

5

引数としてバッファを渡すと、このタイプのコードで発生する可能性のあるほとんどの問題が解決されます。

バッファへのポインタを返す場合は、その割り当て方法と、呼び出し元がバッファを解放する責任があるかどうかを判断する必要があります。この関数は、解放する必要のない静的ポインターを返す可能性がありますが、スレッドセーフではありません。

于 2011-05-05T05:08:42.640 に答える
3

バッファとサイズを渡すことは、特に文字列のサイズが通常「妥当な」サイズである場合は特に、エラーが発生しにくくなります。メモリを動的に割り当ててポインタを返す場合、呼び出し元はメモリを解放する責任があります(また、関数がメモリを割り当てた方法に応じて、メモリに対応する解放関数を使用することを忘れないでください)。

Win32などの大規模なCAPIを調べると、文字列を返す事実上すべての関数が、呼び出し元がバッファーとサイズを渡す最初の形式を使用していることがわかります。限られた状況でのみ、関数が戻り値を割り当てる2番目の形式を見つけることができます(現時点では何も考えられません)。

于 2011-05-05T05:07:48.850 に答える
1

戻りコードを使用して、バッファーとサイズのスタイルを渡す別の方法:

size_t example_m_a(type_a a,char * buff,size_t buff_size)

ゼロの戻りコードは、呼び出し元のバッファーが適切であり、入力されていることを示します。

戻りコード>0は、呼び出し元のバッファーが小さすぎることを示し、実際に必要なサイズを示し、呼び出し元がバッファーのサイズを変更して再試行できるようにします。

于 2011-05-05T05:41:35.867 に答える
1

関数が必要なバッファーの大きさを決定できるため、2番目のオプションをお勧めします。多くの場合、発信者はその決定を下す立場にありません。

于 2011-05-05T05:07:50.370 に答える
0

ほとんどの場合、バッファーのアドレスと長さを渡すのが最適です。エラーが発生しにくく、メモリ リークを心配する必要がありません。実際、一部のタイトな組み込みシステムでは、ヒープを使用することはまったく望ましくありません。ただし、関数がバッファをオーバーランしてはなりません。システムがクラッシュしたり、さらに悪いことに、ハッカーに対して脆弱になる可能性があるためです。

関数が割り当てられたバッファを返すのを見たのは、xmlDoc から XML テキストを生成する libxml の API だけです。

于 2011-05-05T06:08:59.133 に答える