2012-01-09 3 views
1

В C++, я могу создать 2D массив с фиксированным числом столбцов, скажем, 5, следующим образом:динамическое выделение строк 2D массива в C++

char (*c)[5]; 

то я могу выделить память для строки следующим образом

c = new char[n][5]; 

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

+4

Добро пожаловать на C++! Пожалуйста, отбросьте свои знания в стиле C и предайтесь «std :: vector» и 'std :: array'! Если вы предпочитаете, 'boost :: multi_array' также является вариантом! – Xeo

+0

Вы сказали C++, но обычно вы делаете такие вещи на C, а не на C++. Вот хорошая ссылка, объясняющая, как сделать динамические массивы с помощью malloc (http://c-faq.com/aryptr/dynmuldimary.html). –

ответ

4

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

char ** c = new char*[n]; // array of pointers, c points to first element 

for (unsigned int i = 0; i != n; ++i) 
    c[i] = new char[get_size_of_array(i)]; // array of chars, c[i] points to 1st element 

несколько более структура данных, C++ будет std::vector<std::string>.

Как вы заметили в комментарии, динамические массивы, выделенные new[], не могут быть изменены, поскольку в C++ нет аналога realloc (это не имеет смысла с объектной моделью, если вы думаете об этом). Поэтому вы всегда должны выбирать подходящий контейнер для любой ручной попытки динамического управления жизненным циклом.

Подводя итог: Не используйте new. Когда-либо. Используйте соответствующие динамические контейнеры.

+0

Я хочу знать, могу ли я исправить количество столбцов, как в char (* c) [5], а затем динамически выделять количество строк, а не наоборот. –

+0

@sidharthsharma: Да, используйте 'std :: vector >'. Динамические массивы, выделенные с помощью 'new []', не могут быть изменены; в C++ нет аналога 'realloc'. –

+1

Kerrek, это одна из вещей, которые меня озадачивают в stackexchange: как вы объясните, что я ответил немного больше, чем на минуту раньше вас, и все же вы получаете все upvotes, пока я ничего не получаю? –

1

Вам необходимо объявить c следующим образом: char** c; затем выделите основной массив следующим образом: c = new char*[n]; и затем распределите каждый младший массив следующим образом: c[i] = new char[m]

+0

, но выделяет фиксированное количество строк n и не фиксированное количество столбцов. Я просто хочу знать, можно ли сделать что-то подобное или нет. –

+1

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

0
#include <iostream> 
using namespace std; 

main() 
{ 
    int row,col,i,j; 
    cout<<"Enter row and col\n"; 
    cin>>row>>col; 

    int *a,(*p)[col]=new (int[row][col]); 
    for(i=0;i<row;i++) 
      for(j=0;j<col;j++) 
       p[i][j]=i+j; 

     for(i=0;i<row;i++) 
      for(j=0;j<col;j++) 
       cout<<i<<" "<<j<<" "<<p[i][j]<<endl; 
       //printf("%d %d %d\n",i,j,p[i][j]); 




} 
Смежные вопросы