Проблемы с инициализацией двумерного массива в чистом С

Рейтинг: 0Ответов: 1Опубликовано: 21.05.2023

Есть двумерный массив:

double ** distance_matrix = create_matrix(4);

Есть функция, создающая его:

double ** create_matrix(size_t matrix_size)
{
  double ** matrix;  
  
  matrix = (double **)malloc(sizeof(matrix) * matrix_size);

  for (size_t i = 0; i < matrix_size; ++i)
    {
      matrix[i] = (double *) malloc(sizeof(matrix[i]) * matrix_size);      
    }
  return matrix; 
}

И, самое главное, есть функция, его заполняющая:

void init_distance_matrix(double *** matrix, int matrix_size)
{
  double ** distance_matrix = *(matrix);
  
  distance_matrix[0][0] = 0;
  distance_matrix[0][1] = -1;
  distance_matrix[0][2] = 7;
  distance_matrix[0][3] = 25;
  //printf("ok\n");
  distance_matrix[1][0] = 18;
  distance_matrix[1][1] = 0;
  distance_matrix[1][2] = 4;
  distance_matrix[1][3] = 3;

  distance_matrix[2][0] = -1;
  distance_matrix[2][1] = 5;
  distance_matrix[2][2] = 0;
  distance_matrix[2][3] = 27;

  distance_matrix[3][0] = -1;
  distance_matrix[3][1] = 8;
  distance_matrix[3][2] = 94;
  distance_matrix[3][3] = 0;
}

Проблема в том, что когда printf("ok\n") раскоментирована, то все работает. Но стоит ее закоментировать, и программа падает на этой функции.

Ответы

▲ 0Принят

Вы выделяете память используя неправильные типы. Сначала массив для указателей :

matrix = (double **)malloc(sizeof(matrix) * matrix_size);
// тип matrix == double * *

потом опять массив указателей :

matrix[i] = (double *) malloc(sizeof(matrix[i]) * matrix_size);
// тип matrix[i] == double *

А в массиве должны были быть не указатели, а числа типа double.

Можно указывать типы других элементов :

matrix = (double **)malloc(sizeof(matrix[0]) * matrix_size);
// тип matrix[0] == double *
matrix[i] = (double *) malloc(sizeof(matrix[i][0]) * matrix_size);
// тип matrix[i][0] == double

или же явно указывать типы :

matrix = (double **)malloc(sizeof(double*) * matrix_size);
matrix[i] = (double *) malloc(sizeof(double) * matrix_size);

Так как типы double и указатели обычно имеют один размер 8 байт, то эта проблема несоответствия типов в вашем коде могла не играть роль. И настоящая проблема может находится в другом участке кода.