Динамическое выделение памяти для 3D массива [дубликат]

7
задан Community 23 May 2017 в 12:02
поделиться

5 ответов

array = malloc(num_elem * num_elem * num_elem * sizeof(array_elem));

Почему нет? :)

1
ответ дан 6 December 2019 в 07:05
поделиться

@Poita_, ладно, возможно, вы правы, но если кто-то все еще хочет использовать трехмерный массив, размещенный в одном большом фрагменте, вот как вы добавляете нормальный его индексирование:

void*** newarray(int icount, int jcount, int kcount, int type_size)
{
    void*** iret = (void***)malloc(icount*sizeof(void***)+icount*jcount*sizeof(void**)+icount*jcount*kcount*type_size);
    void** jret = (void**)(iret+icount);
    char* kret = (char*)(jret+icount*jcount);
    for(int i=0;i<icount;i++)
        iret[i] = &jret[i*jcount];
    for(int i=0;i<icount;i++)
        for(int j=0;j<jcount;i++)
            jret[i*jcount+j] = &kret[i*jcount*kcount*type_size+j*kcount*type_size];
    return iret;
}
1
ответ дан 6 December 2019 в 07:05
поделиться

Это будет работать

int main()
{

    int ***p,i,j;

    p=(int ***) malloc(MAXX * sizeof(int **));

    for(i=0;i<MAXX;i++)
    {
        p[i]=(int **)malloc(MAXY * sizeof(int *));
        for(j=0;j<MAXY;j++)
            p[i][j]=(int *)malloc(MAXZ * sizeof(int));
    }

    for(k=0;k<MAXZ;k++)
        for(i=0;i<MAXX;i++)
            for(j=0;j<MAXY;j++)
                p[i][j][k]=<something>;
}
6
ответ дан 6 December 2019 в 07:05
поделиться

Для данного типа T (несмежный):

size_t dim0, dim1, dim2;
...
T ***arr = malloc(sizeof *arr * dim0); //type of *arr is T **
if (arr)
{
  size_t i;
  for (i = 0; i < dim0; i++)
  {
    arr[i] = malloc(sizeof *arr[i] * dim1); // type of *arr[i] is T *
    if (arr[i])
    {
      size_t j;
      for (j = 0; j < dim1; j++)
      {
        arr[i][j] = malloc(sizeof *arr[i][j] * dim2);
      }
    }
  }
}

Если вы не работаете с очень старой реализацией (до C89), вам не нужно приводить результат malloc () , поэтому такая практика не приветствуется. Если вы забыли включить stdlib.h или у вас нет прототипа для malloc () в области видимости, компилятор напечатает его, чтобы вернуть int , и вы получите Предупреждение типа "несовместимый тип для присвоения". Если вы приведете результат, предупреждение будет подавлено, и нет гарантии, что преобразование указателя на int в указатель снова будет значимым.

0
ответ дан 6 December 2019 в 07:05
поделиться

Есть два разных способа выделить 3D-массив. Вы можете выделить его как одномерный массив указателей на (одномерный массив указателей на одномерный массив). Это можно сделать следующим образом:

 int dim1, dim2, dim3;
 int i,j,k;
 double *** array = (double ***)malloc(dim1*sizeof(double**));

        for (i = 0; i< dim1; i++) {

         array[i] = (double **) malloc(dim2*sizeof(double *));

          for (j = 0; j < dim2; j++) {

              array[i][j] = (double *)malloc(dim3*sizeof(double));
          }

        }

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

const int dim1, dim2, dim3;  /* Global variables, dimension*/

#define ARR(i,j,k) (array[dim2*dim3*i + dim3*j + k])
double * array = (double *)malloc(dim1*dim2*dim3*sizeof(double));

Для доступа к вашему массиву вы просто используете макрос:

ARR(1,0,3) = 4;
17
ответ дан 6 December 2019 в 07:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: