различия в распределении 3D-массивов в C

#c #arrays #malloc #heap-memory #alloc

#c #массивы #malloc #куча-память #выделить

Вопрос:

Я работаю с некоторыми изображениями на c , поэтому из-за размера мне нужно выделить несколько массивов.

Мне нужно использовать определенную функцию, которая принимает только array в качестве аргумента.

Если я инициализирую массив как глобальную переменную следующим образом: двойной буфер[193][229][193]; Я могу использовать буфер массива в функции без проблем.

Однако, если я попытаюсь выделить новый массив с помощью этой функции:

     int Create3D_Array(Type ****pResult, int x, int y, int z)
{
    Type ***p = new Type **[x];
    for(int i = 0; i < x; i  )
    {
        p[i] = new Type *[y];
        for(int j = 0; j < y; j  )
            p[i][j] = new Type[z];
    }
    *pResult = p;
    return x * y * z;
}
  

Функция перестает работать. Я не получаю сообщений об ошибках, программы просто завершают работу, что означает, что существуют некоторые проблемы с индексом массива.

В принципе, я хочу знать, в чем разница между функцией, которую я использую, и просто объявить массив как двойной буфер[193][229][193]. Спасибо всем за помощь.

——————————————РЕДАКТИРОВАТЬ — ПОЛНЫЙ КОД ——————————

  int main() {
    const int yy =229;
    const int zz =193;
    const int xx =193;

    double ***test = NULL;
    Create3D_Array(amp;test, xx, yy, zz);


      /* open the volume - first and only command line argument */

    mihandle_t    minc_volume;
        int           resu<
        /* open the volume - first and only command line argument */
        result = miopen_volume("image_name", MI2_OPEN_READ, amp;minc_volume);
        /* check for error on opening */
        if (result != MI_NOERROR) {
          fprintf(stderr, "Error opening input file: %d.n", result);
        }

        unsigned long start[3], count[3];


          start[0] = start[1] = start[2] = start[3] = 0;
          count[0] = 193;
          count[1] = 229;
          count[2] = 193;
      std::cout<<test[1][0][0]<<std::endl;

 miget_real_value_hyperslab(minc_volume, MI_TYPE_DOUBLE, start, count, test));

        std::cout<<test[1][0][0]<<std::endl;
        Delete3D_Array(amp;test, xx, yy, zz);
        return 0;
  

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

1. Вы пробовали отладчик? Почему программа завершает работу? На первый (по общему признанию, краткий) взгляд я не вижу здесь никаких проблем.

2. В вашей функции вы выделяете 2d-массив указателей на 1d двойные массивы, в то время double buffer[193][229][193] как выделяет 3d-массив двойников.

3. могу ли я изменить функцию для выделения двойников?

4. @Findios — ваш код выглядит нормально. Можете ли вы показать еще какой-то контекст вашего варианта использования? Проблема, скорее всего, существует.

5. Компилятор все равно сделает это за вас, поэтому разницы в производительности нет. На самом деле вы можете оптимизировать это самостоятельно, если сделаете это вручную, опустив часть вычисления, например. когда вы обрабатываете строку пикселей, просто вычислите ri=y*193 z*193*229 для строки и просто выполните ri x для пикселей в строке