определить 5D объект с выделением памяти - PullRequest
0 голосов
/ 03 апреля 2019

Мне нужно очистить память 5D-объекта, поэтому сначала мне нужно определить его с выделением памяти. Мое предыдущее определение объекта было:

   double I_object[N_GROUPS][NN][NN][NN][NN]={0};

Я заменил его на код ниже и c файл компилируется, но c программа вылетает :(

 I_object=(double *****) malloc(sizeof(double *****)*N_GROUPS);
  for(i = 0; i < N_GROUPS; i++){
      I_object[i]=(double ****) malloc(sizeof(double****)*NN);
      for(j = 0; j < NN; j++){
         I_object[i][j]=(double ***) malloc(sizeof(double***)*NN); 
         for(k = 0; k < NN; k++){
            I_object[i][j][k]=(double **) malloc(sizeof(double**)*NN); 
            for(l = 0; l < NN; l++){
                I_object[i][j][k][l]=(double *) malloc(sizeof(double*)*NN); 
            }
         }
      }
  }

Пожалуйста, дайте мне знать, если это определение 5D-объекта неверно или где я могу найти способ определения 5D-объекта с помощью malloc.

Ответы [ 2 ]

3 голосов
/ 03 апреля 2019

Вы забыли объявить тип I_object.Также вам нужно объявить i, j, k и l.Кроме того, я бы не стал приводить результат malloc в C .Кроме того, уровни косвенности неправильны в ваших sizeof() вызовах, что вызывает проблему в последнем, где может быть разница между размерами double и double*.

Сэти изменения выглядят так:

#define N_GROUPS 3
#define NN 3
int main() {
    double *****I_object = malloc(sizeof(double ****)*N_GROUPS);
    for (size_t i = 0; i < N_GROUPS; i++) {
        I_object[i] = malloc(sizeof(double***)*NN);
        for (size_t j = 0; j < NN; j++) {
            I_object[i][j] = malloc(sizeof(double**)*NN);
            for (size_t k = 0; k < NN; k++) {
                I_object[i][j][k] = malloc(sizeof(double*)*NN);
                for (size_t l = 0; l < NN; l++) {
                    I_object[i][j][k][l] = malloc(sizeof(double)*NN);
                }
            }
        }
    }
}

Кроме того, для будущих вопросов я бы рекомендовал опубликовать Минимальный, Полный и Проверяемый пример .Таким образом, люди гораздо охотнее (и способны) помочь.Например, я должен был сделать предположения о N_GROUPS и NN.Даже при низких значениях, таких как 100 для NN, потребление памяти уже будет настолько высоким, что это может вызвать проблемы, но без MCVE трудно сказать.

1 голос
/ 03 апреля 2019

Вместо того, чтобы иметь массив некоторых указателей на другие массивы некоторых указателей на другие массивы .... просто используйте указатель на массив [nn] [nn] [nn] [nn] двойных значений .

Что-то вроде:

#define NN 2
#define N_GROUPS 4

int main(int argc, char* argv[])
{
  double (*I_object)[NN][NN][NN][NN];              // Define pointer
  I_object = calloc(N_GROUPS, sizeof * I_object);  // Allocate and zero-init memory
  I_object[3][1][1][1][1] = 42;                    // Use as 5D matrix
  printf("%f\n", I_object[3][1][1][1][1]);

  free(I_object);                                  // Free memory
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...