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

标签 c pointers free

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

相关文章:

c - 如何确定 malloc 将分配在不同的区域

c - 使用 sscanf 读取带空格的字符串

c - 文件定义错误

c - 如何验证二维数组中的值?

c++ - 为什么这个指针引用是右值?

c - pointer to 一个指针,也就是指向一个内存块,应该释放哪个指针?

c - 在嵌入上备份 SQLite3 数据库

c - 初始化结构中的指针数组时是否需要花括号?

c - 在 C 中为 AES 中的移位行移位数组元素

C "double free or corruption"错误