2013-03-09 5 views
1

int* array = new int [n];은 힙에 메모리 공간을 할당한다는 것을 알고 있습니다.다른 방법으로 동적 배열 선언

그런 식으로 선언하면 : int array[n]; codeblocks에서 성공적으로 컴파일되지만 Visual Studio로 이동하면 오류가 발생합니다.

내가 물어보고 싶은 것입니다 :

  1. 무엇 int[n] 정말로 않고 어떻게 힙 할당에 비교하면 어떻습니까? 그들 사이의 차이점은 무엇입니까?

  2. int* array = new int [n]; 대신 int array[n]을 사용하면 어떤 오류가 발생할 수 있습니까?

+3

가변 길이는 정적 크기 배열에 사용하면 안됩니다. 코드 블럭은 GCC가 아마도 그것을 확장으로서 지원하기 때문에 그것을 받아 들인다. – 0x499602D2

+4

GCC에서 가져온 문서 :'가변 길이 자동 배열은 ISO C99에서 허용되며 GCC에서 C90 모드와 C++로 허용합니다. ' – chris

답변

4

int array[n]은 스택이 아닌 힙을 선언합니다. 표준 C++에서 n은 컴파일 타임 상수 여야합니다. 그러나 일부 컴파일러에는이 형식으로 선언 된 가변 길이 배열을 허용하는 확장자가 있으며 컴파일시 간은 n입니다. 표준이 아니 어서는 안됩니다.

int array[n]

int* array = new int [n];를 통해 몇 가지 문제가 발생할 수 있습니다 : 큰

  • n 경우 충분히 당신은 스택 오버 플로우가 발생할 수 있습니다. 또는 배열이 클래스 멤버이고 클래스의 큰 배열을 만드는 경우.
  • array 경우
  • array하는 경우가 클래스 멤버 비싼 복사 로 될 수 이동 클래스 멤버이며 배열 및 move 클래스에 대한 포인터를 제공 한 포인터는 이제 게시물을 참조 - 이동 된 객체 또는 객체가 파괴 된 경우 임의의 메모리. 어느 쪽이든, 나쁜.
+0

그래서'int array [n ]'? –

+0

그러면 왜 일부 컴파일러가 확장 기능을 수행합니까? Thx –

+1

@ Liang-YuPan [배열 문제] (http://www.drdobbs.com/the-new-cwhy-variable-length-arrays/184401444) –

3

GCC는 n는 컴파일 시간 상수 값이 아닌 곳 int array[n] 허용 C++의 확장자를 갖는다. 표준 언어에서는 n에 대해 상수가 아닌 값을 사용할 수 없습니다 (C99에서 허용).

3

귀하의 질문을 정확하게 이해하면 답변 할 수 있습니다. int *array = new int[10]가 힙에 할당되는 반면

  1. int array[10]

    는 스택에 할당된다. 일반적으로 스택 배열은 요소 수가 일정하기 때문에 int array[n]은 C90에서 허용되지 않습니다 (n이 일정하지 않은 경우). (창에서 사용을 codeblocks GCC의 컴파일러의 버전입니다)

  2. 는 MinGW는 n이 일정하지 C90 모드에서 int array[n]를 작성할 수 않는 확장자를 갖습니다. Visual C++에서는이를 허용하지 않습니다.

2

int array[n]을 쓸 때, 이는 정적 할당을 수행 중임을 의미합니다. 즉 메모리는 컴파일시 할당됩니다. 따라서 가변 길이를 사용하면 컴파일 시간 오류가 발생합니다.

+0

그런데 왜 코드 블록에서 작동 했습니까 (질문 읽기)? – antonijn

+1

음, antonijn이 대답했습니다 ... –

+1

나는 antonijn입니다 ... – antonijn