是否可以创建无指针功能?

Ede*_*nia 1 c free memory-management function

我们得到了如下的2D分配:

char** arr;
short i = 0;

arr = malloc(sizeof(char*)*10);
for( ; i<10; i++)
{
    arr[i] = malloc(sizeof(char)*100);
}
Run Code Online (Sandbox Code Playgroud)

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

for(i=0; i<sizeof(arr); i++) free(arr[i]);
free(arr);
Run Code Online (Sandbox Code Playgroud)

所以我想创造一个节省时间,空间和混乱的功能,我有这个:

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

    for(i=0; i<sizeof(data); i++)
    {
        free(data[i]);
    }
}
Run Code Online (Sandbox Code Playgroud)

功能是相关的,如果没有另外的方法吗?

Bil*_*nch 6

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

  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;
}
Run Code Online (Sandbox Code Playgroud)

或者,常见的机制是将二维阵列编码成一维阵列.所以,假设我们想要一个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);
Run Code Online (Sandbox Code Playgroud)