(a) не совсем "работает":
Во-первых, у него больше {
, чем }
, поэтому он даже не компилируется.Вы, вероятно, забыли завершить свой внешний цикл for
.
int ** p;
...
if ((p[h]=...))
Это разыменовывает p
до его инициализации.Использование значения неинициализированной переменной является неопределенным поведением.Вам нужно назначить что-то для p
, прежде чем использовать его (возможно, путем динамического выделения другого массива).
Чтобы определить, есть ли у версии (b) такая же проблема, мы должны увидеть вызывающий код,но, по-видимому, это также UB.
Есть еще одна проблема во внутреннем цикле:
for (e = h; e >= 0; --e)
e
- это size_t
, который является целым типом без знака, поэтому условиеe >= 0
всегда верно.
Какой компилятор (и опции компилятора) вы используете?С gcc -Wall -Wextra -pedantic
я получаю предупреждения для обоих этих .
Фиксированная версия будет выглядеть следующим образом:
int **create_matrix(size_t dimension) {
int **p = calloc(dimension, sizeof *p);
if (!p) {
return NULL;
}
for (size_t i = 0; i < dimension; i++) {
if (!(p[i] = calloc(dimension, sizeof *p[i]))) {
while (i--) {
free(p[i]);
}
free(p);
return NULL;
}
}
return p;
}
Версия (b) может быть определена как
status_t create_matrix_2(size_t dimension, int ***p) {
if (!p) {
return ERROR_NULL_POINTER;
}
if (!(*p = create_matrix(dimension))) {
return ERROR_NO_MEMORY;
}
return SUCCESS_OR_SOMETHING;
}
Я не уверен, что вы хотите вернуть для успеха;в вашей версии (b) отсутствует инструкция возврата.