静的にディメンション化された配列のC ++動的に割り当てられた配列
-
05-07-2019 - |
質問
可変数の「char [2]」、つまり2文字の静的配列を保持する構造を作成する必要があります。
質問は、x個のchar [2]にメモリを割り当てる方法です。
これを試しました(int xが定義されていると仮定):
char** m = NULL;
m = new char[x][2];
...
delete [] m;
(動作しませんでした)
std :: vector <!> lt; char [2] <!> gt;を使用できることに気付きました。コンテナとしてですが、生のポインタでどのように行われるのか興味があります。
私はC ++の初心者であり、学習しようとしています。
解決
コードでは、「m」のタイプが「new」コールと一致しません。あなたが欲しいのは:
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;
コンパイル時間範囲チェックを使用したもう1つの非常に安全なオプション:
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を使用して、2次元配列として扱います。
しかし、これについての良い議論のためにあなたは見たいかもしれません: http://www.velocityreviews.com/forums/t283481-dynamic- multidimensional-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;
所属していません StackOverflow