C ++动态分配静态大小的数组

时间:2009-09-11 03:41:32

标签: c++ memory-management dynamic-memory-allocation dynamic-arrays

我需要创建一个包含可变数量'char [2]的结构,即2个字符的静态数组。

我的问题是,如何为x个char [2]分配内存。

我试过这个(假设定义了int x):

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

(它不起作用)

我意识到我可以使用std :: vector< char [2]>作为一个容器,但我很好奇如何使用原始指针。

我是C ++的新手并且正在努力学习。

4 个答案:

答案 0 :(得分:4)

在您的代码中,“m”的类型与“新”调用不匹配。你想要的是:

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

m是指向2个字符数组的指针,你调用new来获取一个包含2个字符的x数组数组,并在第一个字符处指向m。

答案 1 :(得分:4)

我认为以下代码比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;
}

答案 2 :(得分:0)

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;

答案 3 :(得分:0)

您最终会确定数组的大小,然后使用new,并将其视为二维数组。

但是,对于这方面的一个很好的讨论,你可能想看看: http://www.velocityreviews.com/forums/t283481-dynamic-multidimensional-arrays.html