我们得到一个二维分配如下:
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]);
}
}
这个函数是否相关,如果不相关还有其他方法吗?
最佳答案
这样创建函数是完全合理的。特别是如果它:
- 提高代码的清晰度
- 降低出现错误的可能性
我可能会写一个 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/