C では、関数が動的に割り当てられたメモリへのポインターを返し、呼び出し元のコードがそれを解放する必要がある可能性があります。また、呼び出し元のコードが 2 番目の関数にバッファーを提供し、そのバッファーの内容を設定する必要があることもよくあります。例えば:
struct mystruct {
int a;
char *b;
};
struct mystruct *get_a_struct(int a, char*b)
{
struct mystruct *m = malloc(sizeof(struct mystruct));
m->a = a;
m->b = b;
return m;
}
int init_a_struct(int a, char*b, struct mystruct *s)
{
int success = 0;
if (a < 10) {
success = 1;
s->a = a;
s->b = b;
}
return success;
}
どちらかの方法が望ましいですか?両方の引数を考えることができます。get_a_struct メソッドの場合、返された構造体をfree()するだけでよいため、呼び出しコードが単純化されます。init_a_struct メソッドの場合、呼び出し元のコード自体がおそらくメモリを割り当てているため、呼び出し元のコードが動的に割り当てられたメモリの解放に失敗する可能性は非常に低くなります。