c - 是否可以创建无指针函数?

标签 c function memory-management free

我们得到一个二维分配如下:

char** arr;
short i = 0;

arr = malloc(sizeof(char*)*10);
for( ; i<10; i++)
{
    arr[i] = malloc(sizeof(char)*100);
}

分配 arr[10][100]; 然后我们需要像这样释放它:

for(i=0; i<sizeof(arr); i++) free(arr[i]);
free(arr);

所以我想做一个可以节省时间、空间和困惑的功能,我有这个:

void pfree(void** data)
{
    int i;

    for(i=0; i<sizeof(data); i++)
    {
        free(data[i]);
    }
}

这个函数是否相关,如果不相关还有其他方法吗?

最佳答案

这样创建函数是完全合理的。特别是如果它:

  1. 提高代码的清晰度
  2. 降低出现错误的可能性

我可能会写一个 malloc_2d()free_2d():

void free_2d(void **arr, size_t count) {
    int i;

    if (arr) {
        for (i=0; i<count; ++i)
            free(arr[i]);
        free(arr);
    }
}

void** malloc_2d(size_t count, size_t elem_count, size_t elem_size) {
    int i;        
    void **arr = calloc(count, sizeof(void *));

    if (arr == NULL)
        return NULL;

    for (i=0; i<elem_count; ++i) {
        arr[i] = calloc(elem_count, elem_size);
        if (arr[i] == NULL) {
            free_2d(arr, i);
            return NULL;
        }
    }

    return arr;
}

或者,一种常见的机制是将二维数组编码为一维数组。因此,假设我们想要一个 16x4 阵列。

int *arr = malloc(sizeof(int) * 6 * 4);
for (int i=0; i<16; ++i)
    for (int j=0; j<4; ++j)
        arr[i*4 + j] = compute(i, j);

关于c - 是否可以创建无指针函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23980839/

相关文章:

linux - 如何在 Linux 中创建静态程序或进程?

python - 如何在python中处理非常大的文件(13GB)而不会崩溃?

c++ - 可以在从 Thread 类继承的对象上使用 "delete this;"吗?

c - strtok() 没有按预期工作

javascript - 类方法作为 JavaScript 中的事件处理程序?

c++ - Malloc/VirtualAlloc 在 127 dec 之后预置 FFFFFF

C题: error: expected ')' before '*' token

javascript - 在 javascript 中使用数组作为函数

c - 遍历递归函数

c++ - 禁用所有线程默认值的核心关联