[英]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.