Код использует calloc(sizeof(int), SIZE)
, но фактический тип данных в структуре равен int *
, что приводит к недостаточному выделению памяти в некоторых системах (у меня размер int
равен 4, а int *
- 8).
Вот предложение переписать (мы поменяем параметры размера в вызове calloc
на заголовок):
int main(int argc, char const *argv[]) {
int **matrix;
if (!(matrix = calloc(SIZE, sizeof(*matrix)))) {
fprintf(stderr, "calloc failed");
return 1;
}
for (int i = 0; i < SIZE; ++i) {
if (!(matrix[i] = calloc(SIZE, sizeof(*(matrix[i]))))) {
fprintf(stderr, "calloc failed");
return 1;
}
}
printf("%s\n", "Matrix initialized.");
printMatrix(matrix);
return 0;
}
Здесь мы используем *matrix
и *matrix[i]
вместо жесткое кодирование типы int *
и int
соответственно. Это может помочь нам избежать ошибок и отыскать местоположения для изменения кода, если нам нужно в какой-то момент внести коррективы типа.
Мы также проверяем, что calloc
успешно, проверяя, что указатель не равен NULL. Невыполнение этого требования может привести к появлению труднодоступных ошибок из-за неопределенного поведения.
Примечание Должен ли я привести результат malloc
? .