#c #function #matrix #allocation
#c #функция #матрица #выделение
Вопрос:
Я хочу создать функцию на C, которая выделяет динамическую матрицу; идея состоит в том, чтобы выделить массив, элементы которого являются указателями на массивы; если я хочу сделать это в функции, какой правильный код?
это
f(***matrix)
или это
f(**matrix)?
Я бы сказал, первое, но я не уверен. Спасибо!
Комментарии:
1. Ни один из них не является допустимым прототипом функции, и ни одно из них не является полезным выражением вызова функции для такого выделения.
Ответ №1:
Вы, вероятно, хотите что-то вроде
double **
allocate_array(size_t rows, size_t cols)
{
double **array = malloc(cols * sizeof(*array));
if (array == NULL) return NULL;
for (size_t i = 0; i < cols; i ) {
array[i] = malloc(rows * sizeof(*array[i]));
for (size_t j = 0; j < rows; j ) array[i] = 0.0;
if (array[i] == NULL) {
while (i != 0) free(array[--i]);
free(array);
return NULL;
}
}
return array;
}
Комментарии:
1. Для согласованности вместо
sizeof(**array))
я бы написалsizeof(*array[i])
(или какsizeof
есть оператор:sizeof *array[i]
). В любом случае плюс 1, по крайней мере, для внутреннего цикла очистки … 🙂2. Это довольно приятно, но
calloc()
вводит в заблуждение. Нет требования, чтобы ноль с плавающей запятой был побитовым нулем (так же, какNULL
не обязательно должен быть побитовым нулем). Инициализация, выполняемаяcalloc()
, бесполезна.