C ++는 정적 차원의 배열의 동적으로 할당 된 배열을 할당합니다
-
05-07-2019 - |
문제
'char [2]', 즉 2 숯의 정적 배열을 보유하는 구조를 만들어야합니다.
내 질문은 x 수의 char [2]에 대한 메모리를 어떻게 할당 하는가입니다.
나는 이것을 시도했다 (int x가 정의되었다고 가정) :
char** m = NULL;
m = new char[x][2];
...
delete [] m;
(작동하지 않았다)
나는 std :: 벡터를 사용할 수 있다는 것을 알고 있습니다u003Cchar[2]> 컨테이너로서, 그러나 나는 그것이 생 포인터로 어떻게 이루어질 것인지 궁금합니다.
나는 C ++를 처음 접하고 배우려고 노력하고 있습니다.
해결책
코드에서 'M'유형은 '새'호출과 일치하지 않습니다. 당신이 원하는 것은 :
char (*m)[2] = NULL;
m = new char[x][2];
...
delete [] m;
M은 2 숯의 배열에 대한 포인터이며, 새로운 호출을 위해 2 숯의 x 배열을 얻고 첫 번째 char에서 point 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;
}
배열의 크기를 결정한 다음 새로 사용하여 2 차원 배열로 취급합니다.
그러나 이것에 대한 좋은 토론을 위해 다음을보고 싶을 수도 있습니다.http://www.velocityreviews.com/forums/t283481-dynamic-multidemensional-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;