C ++ динамически размещаемый массив статически размерных массивов

StackOverflow https://stackoverflow.com/questions/1408866

Вопрос

Мне нужно создать структуру, которая содержит переменное число 'char [2]', то есть статические массивы из 2 символов.

Мой вопрос: как мне выделить память для х числа символов [2].

Я попробовал это (предполагая, что int x определен):

char** m = NULL;
m = new char[x][2];
...
delete [] m;

(это не сработало)

Я понимаю, что могу использовать std :: vector < char [2] > как контейнер, но мне любопытно, как это можно сделать с помощью необработанных указателей.

Я очень новичок в C ++ и пытаюсь учиться.

Это было полезно?

Решение

В вашем коде тип «m» не соответствует вашему «новому» вызову. То, что вы хотите, это:

char (*m)[2] = NULL;
m = new char[x][2];
...
delete [] m;

m - указатель на массивы из 2-х символов, и вы вызываете new, чтобы получить массив из x-массивов из 2-х символов и указать m на первый.

Другие советы

Я считаю, что следующий код более читабелен, чем char[n][2]:

typedef char wchar[2];   // array of two chars
const size_t n = 100;    // some const
wchar* x = new wchar[n]; // array of wchars, where wchar is array of two chars

// here is still a problem that you could write the following
x[5][5] = 0;             // not what you expected?

delete[] x;              // clean up

Если нам известна внутренняя структура wchar, код будет более читабельным, если мы объявим его следующим образом:

// using struct is just gives names to chars in wchar, without performance drop
struct wchar {
  char h;
  char l;
};

...

const size_t n = 100;    // some const
wchar* x = new wchar[n]; // array of wchars

x[0].h = 0;
x[0].l = 0;

delete[] x;              // clean up

И, наконец, поскольку мы используем C ++, нет необходимости использовать массивы C:

const size_t n = 100;    // some const   
typedef std::tr1::array<wchar, n> my_arr;
my_arr* x = new my_arr;

(*x)[0].h = 0;
(*x)[0].l = 0;

delete x;

Еще один довольно безопасный вариант с проверкой диапазона времени компиляции:

template<int n_max>
struct array_n {
    char v[2*n_max];

    template<size_t n, size_t s> 
    char& get() {
        BOOST_STATIC_ASSERT( s < 2 );
        BOOST_STATIC_ASSERT( n < n_max );
        return v[n*2+s];
    };  
};

int main( int argc, char**argv)
{
    const size_t n = 100;    // some const   
    typedef array_n<100> my_arr;
    my_arr* x = new my_arr;

    x->get<10, 1>() = 0;   // ok
    x->get<50, 0>() = 0;   // ok
    x->get<10, 2>() = 0;   // compile time error
    x->get<500, 0>() = 0;  // compile time error

    delete x;
}

В конечном итоге вы определяете размер массива, а затем используете new и рассматриваете его как двумерный массив.

Но для хорошего обсуждения этого вы можете посмотреть: http://www.velocityreviews.com/forums/t283481-dynamic- многомерная-arrays.html

unsigned x=10;
typedef char A2[2];
A2 *m=new A2[x];
m[0][1]='a';
m[9][0]='b';
delete[] m;

C многомерных массивов (где все, кроме первых измерений являются постоянными) расположены непрерывно.

Если вы хотите (потенциально зазубренный) многомерный массив, который является 1d-массивом 1d-массивов, то вы должны выполнить цикл:

  char **m=new char *[x];
  for (unsigned i=0;i<x;++i) m[i]=new char[2];
  ...
  for (unsigned i=0;i<x;++i) delete[] m[i];
  delete[] m;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top