簡體   English   中英

C99中的可變函數要重新分配幾個數組?

[英]Variadic function in C99 to deallocate several arrays?

當前,我有一個非常簡單的函數來在程序中釋放雙精度數組:

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__}                        \
             )

您可以這樣做:

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函數有其用例,但它們很容易出現指針錯誤,因為某些隱式轉換不會發生(因為編譯器不知道超出第一個的論點)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM