Вы можете не просто вернуть malloc( x * y * sizeof(type) );
Это приведет к ошибке сегментации, когда вы попытаетесь проиндексировать массив как двумерный массив.
int **a = malloc(10 * 10 * sizeof(int));
a[1][0] = 123;
a[0][1] = 321;
Результат вышеописанного: Segmentation fault
Сначала необходимо создать массив указателей с помощью c/malloc()
, затем выполнить итерацию этого массива указателей и выделить место для ширины для каждого из них.
void *calloc2d(size_t x, size_t y, size_t elem_size) {
void **p = calloc(y, sizeof(void*));
if(!p) return NULL;
for(int i = 0; i < y; i++) {
p[i] = calloc(x, elem_size);
if(!p[i]) {
free2d(y, p);
return NULL;
}
}
return (void*)p;
}
и бесплатно
void free2d(size_t y, void *matrix) {
if(!matrix) return;
void **m = matrix;
for(int i = 0; i < y; i++) {
if(m[i]) free(m[i]);
}
free(m);
return;
}