int (*i)[10000] = new int[10000][10000];
i[0][0] = 100;
ShowMessage( i[0][0] );
delete[] i;
오른쪽 첨자는 항상 상수값이어야합니다.
ex) int (*i)[100] = new int[x][100];
--------------------------------------------------------------------------------------------
뒤늦은 답변이지만 저도 한때 안되는걸로 알았었습니다.
물론 한번에 되지는 않습니다. 하지만 아래처럼 약간의 수고를 해서 구현하려 하지 못한것이 못내 아쉽기도
합니다. ㅋㅋㅋ ^^ㅋ
동적 2차원 배열로 구성하려면 약간 수고?를 해서 구성해 주면 정적 배열선언처럼 쉽게 사용할 수 있습
니다. 이를 이용하면 3차원도 가능하겠지요. 단, 메모리 해제를 잊지 말아야 합니다.
따로 해제관련으로 관리해 주는것이 좋을것 같습니다.
자~ 잡담은 그만하고, 아래에 네이버 지식인에서 퍼온 글을 읽어보세요. ^^
[네이버 지식인]
*a = (int *) malloc(sizeof(int)*r1); // a[b]의 메모리 할당
for(i = 0 ; i < r1 ; i++)
{
a[i] =(int *) malloc(r1*sizeof(int)); // a[b][b]의 메모리 할당
}
는 다음과 같이 고치십시요.
int **a;
a = (int **) malloc(sizeof(int)*r1); // a[b]의 메모리 할당
for(i = 0 ; i < r1 ; i++)
{
a[i] =(int *) malloc(r1*sizeof(int)); // a[b][b]의 메모리 할당
}
왜 할당이 안되었는지 알려드리죠.
a는 포인터의 포인터로 정의되었습니다. 이 말은 바꾸어 말하면 int형의 데이터를 가리키는 포인터를 가리키는 포인터가 a의 정체라는 뜻입니다. 이러니 저러니 말은 많이 해도 일단 a는 일단 포인터입니다. 포인터는 초기화를 안했을경우 그 안에 어떤 값이 들어있을지 알수가 없답니다. 만약 a안에 1이 들어있다고 하면,
*a = (int *) malloc(sizeof(int)*r1);
줄은 malloc에 의해 할당된 메모리의 주소값이 리턴되어 *a로 들어갑니다. 즉 a가 가리키는 1번지에 그 주소값이 들어간단 뜻이죠. 도대체 그 1번지에 어떤 데이터가 있었을까요? 그건 아무도 없겠지만, 여하튼 데이터는 완전히 날라가 버립니다.
그리고 malloc으로 데이터를 할당한 이후 그 포인터의 값이 NULL인지 반드시 확인해 보십시요. NULL이라면 메모리가 할당되지 않았단 뜻이므로, 프로그램을 계속 진행시키면 안됩니다. 그러니 조십하십시요.
reflexive 는 님이 뭘 원하는 건지를 잘 모르겠군요. 그래서 그냥 넘기겠습니다.
ps.
http://kin.naver.com/browse/db_detail.php?dir_id=10104&docid=290520
권기식 님이 쓰신 글 :
: 안녕하세요?
: 2차원 배열을 동적 할당하려고 하는데요...
: 한 번도 안해봐서 잘 안되는군요...
:
: 클래스 멤버로 선언된 포인터 변수를 외부나 다른 멤버 펑션에서 동적으로 할당하려고 합니다.
:
: int *i;
:
:
: i = new int[5][5];
:
: 이런식으로 하면 안되더군요...
: 포인터 선언을 2중으로, 즉 포인터의 포인터로 선언해도 안되고...
:
: 도움 부탁드리겠습니다.