gpt4 book ai didi

c - 在不知道其类型的情况下,释放为指向指针的指针分配的所有空间

转载 作者:太空狗 更新时间:2023-10-29 16:01:00 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com