0

現在、プログラムで double の配列を解放するための非常に単純な関数があります。

void deallocate(double** array)
{
    free(*array);
}

いくつかの配列を取り、それらを次々に解放するために、この関数を可変長にしたいと思います。私は可変引数関数を書いたことがありません。ポインターを使用したトリックが存在する可能性があるため、その方法を知りたいです。

4

2 に答える 2

3

可変引数関数でこれを行わないでください。この概念は廃止する必要があります。特に、すべて同じ型の引数を受け取ることはまったく意味がありません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__}                        \
             )
于 2014-02-19T10:20:33.273 に答える