Перераспределение 2D массивов на C ++ - PullRequest
0 голосов
/ 10 марта 2012

Допустим, у меня есть:

#include <iostream>
using namespace std;
int **a; //Global Variable
int main()
{
   n=5;
   a = new int*[n];
   for ( int i = 0 ; i < n ; i++ ) 
   a[i] = new int[n] ;
}

Есть ли метод realloc () для увеличения размера строки?( размер столбца фиксирован ) Я имею в виду, что если размер строки равен 5, то я хочу сделать его не намного больше, просто +1.Я использую

for(i=0;i<n;i++)
{
   counter++;
   a[i] = (int *) realloc(a[i],counter*sizeof(int));
}

, но я думаю, что что-то не так ....

Редактировать: пожалуйста, не советуйте какой-либо вектор или что-то подобное ... Потому что мне нужен мой массив как глобальный

Ответы [ 3 ]

4 голосов
/ 10 марта 2012

realloc работает только когда вы выделены с malloc.Если вы использовали new, вам придется delete, а затем снова использовать new (или просто использовать что-то вроде std::vector).

РЕДАКТИРОВАТЬ: Поскольку вы спросили примерmalloc:

a = new int*[n];

станет

a = (int **) malloc (n * sizeof (int *));

, а

a[i] = new int[n] ;

станет

a[i] = (int *) malloc (n * sizeof (int));
0 голосов
/ 10 марта 2012

Ответ: Нет!

Управление памятью в C ++ не содержит функций для перераспределения / изменения размера выделенной памяти.Вы должны реализовать это самостоятельно, используя новую семантику / копировать / удалить

0 голосов
/ 10 марта 2012

Вы можете написать свою собственную подпрограмму для изменения размера массива.

Если вы хотите изменить размер блока с размером N

  1. , выделите (новый) новый размер N
  2. скопировать старый массив / блок в этот вновь выделенный массив / блок
  3. освободить старый массив (удалить)

Чтобы избежать повторного вызова этой подпрограммы, лучше предварительно выделить большой фрагментразмер чанка будет определяться потребностью вашего приложения и должен быть таким, чтобы избежать многократного изменения размера массива.

...