Ваши репозитории Ubuntu настроены неправильно.
Добавьте некоторое хранилище, выполнив следующую команду:sudo apt-add-repository "deb http://archive.ubuntu.com/ubuntu xenial-updates main restricted"
Теперь попробуйте обновить: sudo apt-get update
Обновление: sudo apt-get upgrade
int **matrix;
matrix = (int **)calloc(N, sizeof(int *));
...
Код не работает, поскольку выше это не 2D-массив, а скорее сегментированная, ориентированная на указатель таблица. Таким образом, это не маловажно совместимо с массивами.
Нет причин, по которым вам нужно иметь такую таблицу поиска. Проблема, вероятно, возникает в путанице в том, как правильно распределять многомерные массивы.
В комментариях и других ответах были указаны некоторые потенциальные проблемы, связанные с type согласованностью (предложения использовать либо int, либо uint16_t, но не смешивать) и выделение памяти.
Предложение о создании памяти. Для простоты и удобочитаемости, особенно если вы хотите эмулировать несколько измерений массива, рассмотрите возможность инкапсуляции памяти в функцию. Например:
uint16_t ** Create2D(int c, int r)
{
uint16_t **arr;
int y;
arr = calloc(c, sizeof(uint16_t *));
for(y=0;y<c;y++)
{
arr[y] = calloc(r, sizeof(uint16_t));
}
return arr;
}
Вызвать функцию следующим образом:
uint16_t ** matrix = Create2D(N, M);
if(matrix)//always good to check return of [c][m]alloc before using
{
// Use allocated memory
...
Примечания:
В этом примере не создается 2D-матрица, а скорее эмуляция одного. (как подробно описано здесь ЗДЕСЬ) Это на самом деле просто указатель на набор указателей, каждый из которых указывает на выделенную память, так что их содержимое может быть доступно с помощью нотации столбцов столбцов, как если бы оно было создано как:uint16_t array[N][M];
В этом примере не создается 2D-матрица, а скорее эмуляция одного. (как подробно описано здесь ЗДЕСЬ) Это на самом деле просто указатель на набор указателей, каждый из которых указывает на выделенную память, так что их содержимое может быть доступно с помощью нотации столбцов столбцов, как если бы оно было создано как: Для каждого вызванного [m][c]alloc(), должен быть соответствующий вызов free().Освобождение этой памяти также может быть реализовано в инкапсулированной форме. Например:
void free2D(uint16_t **arr, int c)
{
int i;
for(i=0;i<c;i++)
{
free(arr[i]);
}
free(arr);
}