C99中的变量函数可以解除分配几个数组?

时间:2014-02-19 09:50:28

标签: c c99 variadic-functions variadic-macros

目前,我有一个非常简单的功能来解除程序中的双打数组:

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

我希望这个函数是可变的,以便获取几个数组,然后一个接一个地释放它们。我从来没有编写过变量函数,因为可能存在指针技巧,我想知道如何做。

2 个答案:

答案 0 :(得分: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__}                        \
             )

答案 1 :(得分:2)

你可以这样做:

void deallocate(double *p, ...)
{
    va_list ap;

    va_start(ap, p);
    do {
        free(p);
        p = va_arg(ap, double *);
    } while (p);
    va_end(ap);
}

致电deallocate(p1, p2, p3, (double *)NULL)。您需要NULL(或其他一些值)作为标记来表示参数列表的结尾;其他指针都不应该是NULL,否则循环会过早停止。

我并不是说这是一个好主意,但是:varargs函数有它们的用例,但它们容易出错,因为一些隐式转换不会发生(因为编译器不知道)超出第一个参数的类型。