我需要创建一个包含可变数量'char [2]的结构,即2个字符的静态数组。
我的问题是,如何为x个char [2]分配内存。
我试过这个(假设定义了int x):
char** m = NULL;
m = new char[x][2];
...
delete [] m;
(它不起作用)
我意识到我可以使用std :: vector< char [2]>作为一个容器,但我很好奇如何使用原始指针。
我是C ++的新手并且正在努力学习。
答案 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