現在、プログラムで double の配列を解放するための非常に単純な関数があります。
void deallocate(double** array)
{
free(*array);
}
いくつかの配列を取り、それらを次々に解放するために、この関数を可変長にしたいと思います。私は可変引数関数を書いたことがありません。ポインターを使用したトリックが存在する可能性があるため、その方法を知りたいです。
現在、プログラムで double の配列を解放するための非常に単純な関数があります。
void deallocate(double** array)
{
free(*array);
}
いくつかの配列を取り、それらを次々に解放するために、この関数を可変長にしたいと思います。私は可変引数関数を書いたことがありません。ポインターを使用したトリックが存在する可能性があるため、その方法を知りたいです。
可変引数関数でこれを行わないでください。この概念は廃止する必要があります。特に、すべて同じ型の引数を受け取ることはまったく意味がありませんvoid*
。
最初にポインターの配列を受け取る単純な関数を用意するだけです
void free_arrays(void* a[]) {
for (size_t i = 0; a[i]; ++i) free(a[i]);
}
次に、そのようなマクロでそれをラップできます
#define FREE_ARRAYS(...) free_arrays((void*[]){ __VA_ARGS__, 0 })
0
これは、処理がその時点で停止するため、ポインターがまだ ではないことを前提としています。
一部のポインターが であってもそれを機能させる必要がある場合は0
、要素の数を最初のパラメーターとして関数に渡す必要があります。これは少し面倒ですが、マクロでも判断できます。
void free_arrays0(size_t n, void* a[]) {
for (size_t i = 0; i < n; ++i) free(a[i]);
}
#define FREE_ARRAYS0(...) \
free_arrays( \
sizeof((void*[]){ __VA_ARGS__})/sizeof(void*), \
(void*[]){ __VA_ARGS__} \
)