我需要创建一个包含可变数量'char[2]'的结构,即2个字符的静态数组。
我的问题是,如何为 x 个字符 [2] 分配内存。
我试过这个(假设 int x 已定义):
char** m = NULL;
m = new char[x][2];
...
delete [] m;
(它没有工作)
我意识到我可以使用 std::vector<char[2]> 作为容器,但我很好奇如何使用原始指针来完成。
我对 C++ 很陌生,正在努力学习。
我需要创建一个包含可变数量'char[2]'的结构,即2个字符的静态数组。
我的问题是,如何为 x 个字符 [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 来获取一个由 2 个字符组成的 x 数组的数组,并将 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;
}
unsigned x=10;
typedef char A2[2];
A2 *m=new A2[x];
m[0][1]='a';
m[9][0]='b';
delete[] m;
C 多维数组(除了第一个维度之外的所有维度都是常数)是连续布局的。
如果你想要一个(可能是锯齿状的)多维数组,它是一维数组的一维数组,那么你必须循环:
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;
您最终会确定数组的大小,然后使用 new 并将其视为二维数组。
但是,要对此进行很好的讨论,您可能需要查看: http ://www.velocityreviews.com/forums/t283481-dynamic-multidimensional-arrays.html