2017-11-08 1 views
0

정적 배열과 동적 배열의 기본 개념을 이해합니다. 이 두 가지의 주요 차이점은 컴파일 타임에 메모리를 할당하는 정적 배열과 런타임에 메모리를 할당하는 것입니다. 그러나 우리는 크기가 사용자 입력 값이 될 정적 배열을 만들 수 있습니다.동적 배열 및 정적 배열 컴파일 시간 또는 런타임?

int value ; 
cin >> value ; 

int array [value] ; 
int i = 0 ; 
while(i < value) 
{ 
    cin >> array[i] ; 
    i ++ ; 
} 

따라서 프로그램은 런타임까지이 배열의 크기를 알지 못합니다. 정적 배열과 동적 배열의 실제 근본적인 차이점은 무엇입니까? 정적 배열을 사용하여 런타임에 공간을 할당 할 수 있습니까?

또한 배열의 크기 조정 가능성에 대해 이야기합니다. 동적 배열을 확장하기 위해 요소를 새로운 이중 크기 동적 배열에 복사 한 후 이전 배열을 삭제할 수 있습니다. 우리는 정적 배열에서도 똑같이 할 수 있습니까? [그러나 원래 배열은이 경우 삭제할 수 없으며 중복 스택 공간을 사용합니다. IS가이 유일한 차이점입니다.

+0

"원시"배열은 동적이 아니며 (크기는 변경되지 않음) 동적으로 할당 될 수 있습니다. 'std :: vector'는 동적이며 (런타임에 크기를 조정할 수 있습니다)이 경우 사용해야합니다. – crashmstr

+1

VLA는 표준 C++가 아닙니다. 그것은 연장입니다. – Jarod42

+0

_ 시간에 컴파일 할 때 메모리가 할당되지 않습니다. –

답변

0

이 선언을 허용하는 부분 C99 표준으로 "가변 길이 배열"이라는 컴파일러 확장이 있습니다.

C99 표준은 C++ 언어의 일부로 공식적으로 지원되지 않습니다.

위의 코드는 C99를 지원하지 않지만, 성공적으로 gccclang에 의해 컴파일 될 것이다 MSVS (마이크로 소프트 비주얼 스튜디오)에서 작동하지 않습니다

0

정적 배열은 스택에 저장 얻을하지만, 동적 배열은 힙에 저장됩니다. 무언가가 스택에 저장되면 범위를 벗어나는 순간 폐기됩니다. 예를 들어, int, chars 등이 있습니다. 그러나 힙에 작성된 경우 가비지 콜렉션이 범위를 벗어나면 작업을 수행하도록 보장해야합니다. 메모리를 정리하고 할당을 올바르게 해제하지 않으면 메모리 누수가 발생할 수 있습니다.