2013-01-16 2 views
1

저는 C++ 초보자입니다. 배우는 동안 나는 이것을 보았습니다.int [] []를 new()로 초기화하십시오.

나는이

같은 포인터가

int (*a)[2][3]

cdecl.org 내가하려고하면 declare a as pointer to array 2 of array 3 of int:

으로이 기술이있는 경우

int x[2][3];

a = &x;

이 작동합니다.

내 질문에 내가 몇 가지 조합을 시도했지만 그것은 아주 제대로하지 않는 새()라고 뭔가

a = new int [] [];

등을 사용할 때이 a을 초기화 할 수있는 방법입니다.

도움이 될 것입니다.

답변

3

그것은 아마도 대답은 당신이 아니다 다시 찾으십시오. 그러나 무엇을 필요가 반환 형식이 (*)[2][3] 인 새식이이 은 상당히 간단합니다. 반환 유형은 new int [n][2][3]입니다. 이것을 수행하면 a은 [3] int 배열의 [2] 배열의 첫 번째 요소 인 을 가리 킵니다. 합계로 세 개의 차원 배열입니다.

new은 최상위 수준의 포인터 레벨 배열 유형에 대한 포인터를 반환하지 않습니다. 배열 의 첫 번째 요소에 대한 포인터를 반환합니다. 그래서 당신은 new int[2][3]을 할 경우, 표현 3 INT의 두 배열의 배열을 할당하지만 C++에, 배열 C의 이유 (깨진 있기 때문에, 3 INT (int (*a)[3])의 배열에 대한 포인터를 반환 적합성). 그리고 다른 방법을 강요하지 않는 방법은 입니다. 따라서 에 2 차원 배열에 대한 포인터를 반환하려면 에 3 차원 배열을 할당해야합니다. (첫 번째 차원은 일 수 있으므로 new [1][2][3]은 속임수를 사용하며 실제로는 에만 [2][3]을 할당하십시오.그런 다음 new Array을 사용할 수 있습니다

struct Array 
{ 
    int data[2][3]; 
}; 

, 예상대로 모든 것이 작동합니다)

더 나은 솔루션은 struct의 배열을 래핑 할 수 있습니다. 배열에 액세스하는 데 필요한 구문은 이 아닙니다.

+0

배열을 조작하고 구문을 유지하는 데 필요한'[] '연산자와 유사한 연산자를 오버로드 할 수 있습니다. 이것이 OP가 달성하기를 원하는 것이지만 적어도 싱글 메모리 할당에 대한 문제를 해결하는지는 확실하지 않습니다. +1 나를 –

+0

@ 제임스 Kanze : 이것은 많이 도움이됩니다. 감사. 대답으로 선택 : – NeonGlow

+0

@IvayloStrandjev 좋은 지적. 배열을 포인터로 자동 변환하기 위해 변환 연산자를 오버로드 할 수도 있습니다. (즉, 표준 배열이 손상되는 방식을 에뮬레이션합니다.) –

5

두 단계로 수행해야합니다. 먼저 포인터 (동적으로 할당 된 배열)에 대한 포인터 배열을 할당 한 다음 각 포인터를 차례대로 할당해야합니다. 전반적으로 나는 더 좋은 옵션은 단순히 std::vector을 사용하는 것입니다 - 이것이 바람직한 종류의 일을하는 C++ 방식입니다.

int a**; 
a = new int*[2]; 
for (int i =0; i< 2;++i){ 
    a[i] = new int[3] 
} 

... use them ... 
// Don't forget to free the memory! 
for (int i = 0; i< 2; ++i) { 
    delete [] a[i]; 
} 

delete [] a; 

편집 :

아직 여기 당신이 원하는 것을 달성하는 방법에 대한 예입니다 및 기본 요청에 따라 - 벡터 버전 :

std::vector<std::vector<int> > a(2, std::vector<int>(3,0)); 

// Use a and C++ will take care to free the memory. 
+0

대신에 '벡터'를 사용하면 어떻게 생겼을까요? – Default

+0

그래서 나는'a = new int [] [];와 같은 단일 문이 없다고 가정합니다. – NeonGlow

+2

이것은 완전히 잘못되었습니다. int [2] [3]는 단일 메모리 블록입니다. –

관련 문제