2

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

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

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

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

(它没有工作)

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

我对 C++ 很陌生,正在努力学习。

4

4 回答 4

4

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

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

m 是一个指向 2 个字符数组的指针,您调用 new 来获取一个由 2 个字符组成的 x 数组的数组,并将 m 指向第一个字符。

于 2009-09-11T04:18:20.453 回答
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;
}
于 2009-09-11T04:32:24.010 回答
0
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;
于 2009-09-11T03:48:06.987 回答
0

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

但是,要对此进行很好的讨论,您可能需要查看: http ://www.velocityreviews.com/forums/t283481-dynamic-multidimensional-arrays.html

于 2009-09-11T03:50:03.773 回答