Динамическая ошибка создания двумерного массива - PullRequest
0 голосов
/ 18 мая 2011

Я пытаюсь создать многомерный массив int со следующим кодом функции:

int ** createIntMatrix(unsigned int rows, unsigned int cols) 
    {

  int ** matrix;
  unsigned int i,j;

  matrix = (int **) calloc(cols, sizeof(int *));

  for(i = 0; i < cols; i++)
    matrix[i] = (int *) calloc(rows, sizeof(int));


  for(i = 0; i < cols; i++)
    for(j = 0; j < rows; j++)
      matrix[i][j] = 0;

  return matrix;
}

Я создаю три экземпляра, используя эту функцию в следующем коде,

cout<<"allocating temporary data holders..."<<endl;
  int ** temp_meanR;
  int ** temp_meanG;
  int ** temp_meanB;
  temp_meanR = createIntMatrix(img->height,img->width);
  temp_meanG = createIntMatrix(img->height,img->width);
  temp_meanB = createIntMatrix(img->height,img->width);
cout<<"....done!"<<endl;

Я получаю доступ к таким элементам, как temp_meanB[4][5].

Но, к сожалению, я получаю следующую ошибку во время выполнения:

allocating temporary data holders...
....done!
tp6(1868) malloc: *** error for object 0x122852e08: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
Abort trap

Где я здесь не так?

1 Ответ

5 голосов
/ 18 мая 2011
  for(i = 0; i < cols; i++)
    for(j = 0; i < rows; i++)
       matrix[i][j] = 0;

обратите внимание на цикл for, там написано j=0; i<rows; i++ ( до редактирования Аарохи Джохала )

Далее вам не нужно устанавливать память вручную на 0, как это делает calloc.

В C ++ вы должны использовать new и delete.

В сегменте кода

matrix = (int **) calloc(cols, sizeof(int *));

for(i = 0; i < cols; i++)
  matrix[i] = (int *) calloc(rows, sizeof(int));

Я думаю, что сначала должны быть выделены строки, а затем для каждой ссылки на строки массивы int.

Визуализируйте так:

        +--------+
        | matrix |
        +--------+
          |            c  o  l  s
          |     +----------------------------+
          V     |                            |
   +--  +---+   +---+---+---+       +---+
   |    |   |-->|   |   |   | . . . |   |
   |    +---+   +---+---+---+       +---+
   |    |   |--+
 r |    +---+  |   +---+---+---+       +---+
 o |    |   |  +-->|   |   |   | . . . |   |
 w |    +---+      +---+---+---+       +---+
 s .      .
   .      .
   .      .
   |    |   |
   |    +---+   +---+---+---+       +---+
   |    |   |-->|   |   |   | . . . |   |
   +--  +---+   +---+---+---+       +---+

Сначала выполните строки, а затем столбцы, в приведенной выше визуализации, затем интерпретация arr[i][j] будет выглядеть как обычный массив.

...