динамическое размещение строк 2D-массива в c ++ - PullRequest
1 голос
/ 10 января 2012

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

char (*c)[5];

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

c = new char[n][5];

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

Ответы [ 3 ]

4 голосов
/ 10 января 2012

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

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. Когда-либо. Используйте соответствующие динамические контейнеры.

1 голос
/ 10 января 2012

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

0 голосов
/ 04 июня 2013
#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]);




}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...