我有一个 C 程序,它使用一些指针,例如 int **
、float **
、double **
、long **
等。最后,我想释放分配给它们的空间。
为了模块化事物,我有一个函数可以采用 pointer-to-pointer 形式的对象并释放为其分配的内存空间。例如,对于 int **
类型的变量,如下所示。
void FreeIntArray(int **A, int length){
int i;
for (i = 0; i < length; i ++)
free(A[i]);
free(A);
}
但是,要释放 float **
或 double **
形式的变量,我需要编写另一个函数,它几乎是上述函数的副本, 除了在函数定义中将 int **
更改为 float **
。
是一种设计单个函数的方法,可以将空闲空间分配给以下任何数据类型:int **
、float **
、double * *
, 长 **
?
最佳答案
如果您想严格遵守 ISO C 标准对最大可移植性的定义,没有重复编码是无法做到的。我们可以将逻辑整合到一个函数中,但该函数需要对指示类型的整数变量进行某种切换,以便它可以正确访问 type **
指针作为正确的类型。
我们可以放弃最大可移植性并假设所有指针都具有相同的表示。 (再加上我们不会被优化编译器中严格的别名假设所困扰的额外假设。)然后我们可以这样写:
void free_array(void *aptr, size_t nelem) {
void **a = (void **) aptr;
while (nelem--)
free(*a++);
free(aptr);
}
另一种方法是使用宏:
#define GEN_AFREE(name, type) \
void afree_ ## name (type **a, size_t nelem) \
{ \
[...] \
}
GEN_FREE_ARRAY_FUN(int, int)
GEN_FREE_ARRAY_FUN(double, double)
GEN_FREE_ARRAY_FUN(string, char)
或者不用定义宏,我们可以只创建一个宏来封装对数组的循环并调用 free:
#define FREE_ARRAY(array, size) do { \
size_t iNdEx; \
for (iNdEx = 0; iNdEx < (size); iNdEx++) \
free((array)[iNdEx]); \
free(array); \
} while (0)
关于c - 在不知道其类型的情况下,释放为指向指针的指针分配的所有空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39878298/