Сделайте память и свободную память 3D-массива в C

#arrays #multidimensional-array

Вопрос:

Я новичок в C. Мне был приведен пример создания памяти из 2D-массива, который я всегда использовал. Пример выглядит следующим образом:

     complex** calloc_com2d(int value1, int value2){
  complex **c;
  int i;

  c = (complex**)calloc(value1, sizeof(complex*));
  if(c==NULL){
    perror("MemError.n");
    exit(1);
  }
  for(i=0; i<value1; i  ){
    c[i] = (complex*)calloc(value2, sizeof(complex));
    if(c[i]==NULL){
      perror("MemError.n");
      exit(1);
    }
  }
  return c;
}
 

Другая версия создания памяти из 2d массива выглядит следующим образом:

 complex **mat_new(int t,int r){
  int  i;
  complex **tmp;
  tmp = (complex**)calloc(t, sizeof(complex*));
  for(i=0;i<t;i  ){
    tmp[i] = (complex*)calloc(r, sizeof(complex));
  }
  // MEM =2;
  return tmp;
}
 

Вопрос в том, что я не знаю, что лучше использовать, и если я хочу создать память для 3d-массива, что мне делать? И что мне делать, если я хочу освободить память этого 3D-массива.

Я попытался записать память 3D-массива. Я не знаю, хорошо ли все пройдет. Я думаю, что это не так правильно.

 complex*** calloc_com3d(int value1, int value2, int value3){
      complex ***c;
      int i, j;

      c = (complex***)calloc(value1, sizeof(complex*));
      if(c==NULL){
        perror("MemError.n");
        exit(1);
      }
      for(i=0; i<value1; i  ){
        c[i] = (complex**)calloc(value2, sizeof(complex*));
        if(c[i]==NULL){
          perror("MemError.n");
          exit(1);
        }
        for ( j = 0; j < value2; j  ) {
          c[j] = (complex**)calloc(value3, sizeof(complex));
          if(c[j]==NULL){
            perror("MemError.n");
            exit(1);
          }
        }
      }
      return c;
    }
 

Большое вам спасибо за чтение. Я был бы очень признателен вам за помощь.

Комментарии:

1. Второй не проверяет, была ли выделена память. Это также зависит от того, должна ли память быть непрерывной или нет.

2. @DaveNewton Большое вам спасибо за ваш ответ. Я использую первый в своей программе. Все параметры в массиве имеют значение и указаны, так что, возможно, это означает, что они непрерывны? Извините, я не совсем уверен.

3. Они могут быть смежными, но поскольку память распределена несколькими блоками, нет никакой гарантии-память может быть где угодно. Это не обязательно плохо. Выделение другого измерения может быть выполнено точно таким же образом.

4. @DaveNewton Если я имитирую первый метод написания кода, смогу ли я получить память 3d-массива? Я постараюсь сделать все, что в моих силах.

5. @DaveNewton Я написал один и добавил в часть вопроса. Я не знаю, правильно ли это написано.