동적 메모리 할당에 대한 소개를 받고 있는데 동적 배열 ( int *p = new int[n] \\ where n is the user input describing the number of elements
사용자가 원하는 크기의 배열을 사용자가 필요로하는 / 선언하는 요소 수를 모를 때 사용되는 것과 같은 것) 이 사용 된다는 것을 배웠습니다 . 그러나 대신 이렇게하면 다음과 같이 정적 배열을 선언 할 수 없습니다.
int n;
cout << "Enter the size : " <<endl;
cin>>n;
int a[n];
이 경우 동적 배열의 장점은 무엇입니까? 나는이 개념을 이해하지 못한다.
편집 : 귀하의 답변에 감사드립니다. 일부 사용자는 a [n]을 입력하여 배열을 선언하는 것은 허용되지 않는다고 응답했습니다. 그러나 다음 코드를 입력하면 프로그램이 제대로 실행되는 이유는 무엇입니까?
int main(){
int n;
cout << "Enter the size : " <<endl;
cin>>n;
int a[n];
cout << "Enter your numbers : " <<endl;
for (int i=0;i<=n;i++){
cin>>a[i];
}
for (int i=0;i<=n;i++){
cout<<a[i]<<endl;
}
}
이제 사람들은 이미 int a[n]
유효한 C ++가 아니라고 말했습니다 . 그러나 아마도 당신이 찾고 있는 답으로 당신을 도울 수있을 것 입니다.
이 경우 동적 배열의 장점은 무엇입니까?
이 구문을 int a[n]
VLA (Variable Length Array)라고합니다. 이것은 C ++에서는 불법이지만 C에서는 허용됩니다. 따라서 기술적 인 차이 또는 VLA의 단점에 초점을 맞추겠습니다.
먼저 명백한 것을 제거합시다. C89 이전에는 VLA가 없었으므로 동적 할당은 가변 길이 메모리를 할당하는 유일한 방법이었습니다.
한 가지 더, 정적 배열과 심지어 VLA도 스택에 할당됩니다 (이는 구현이 정의 되었지만 스택에있는 경우가 많음). 반면 동적 배열은 힙에 할당됩니다. 스택과 힙에 대한 자세한 내용은 읽기 이
이제 VLA는 아주 좋은 이유로 C ++에서 금지됩니다. VLA는 모든 종류의 정의되지 않은 동작을 유발할 수 있으며 수행중인 작업을 정확히 알지 않는 한 항상 피해야합니다. 그리고 "당신이 무엇을하고 있는지 정확히 알고있다"는 것은 VLA의 크기 인수가 스택을 넘치지 않을 것이라는 것을 알고 있다는 것을 의미합니다.
VLA 가 C ++에서 허용 되었다고 가정 합니다.이 줄은 코드에서
cin>>n;
int a[n];
사용자가 n
스택 크기보다 훨씬 더 큰 규모를 입력하면 어떻게됩니까? 이는 보장 된 스택 오버플로입니다. 문제가 보이십니까? 힙에 비해 스택은 매우 작습니다. 이것도 여기 와 여기에 설명 되어 있습니다 .
그리고 이 블라스는 피해야한다 주된 이유입니다. VLA는 실제로 앞서 언급 한 것보다 훨씬 더 붐을 일으키지 만. 난 항상 편리 블라스와 관련된 UE들 목록을 유지 가리키고, 그냥 거기 이다 많은 문제.
그래서 내 요점으로 돌아가서
무슨 일을하는지 정확히 알지 못한다면 [VLA]는 항상 피해야합니다.
솔직히 VLA를 절대 사용 해서는 안되며 표준 C ++도 아니기 때문에 사용할 수 없습니다. 그러나 스택 할당은 종종 힙 할당보다 빠릅니다. 이유가 아니더라도 당연하다고 생각할 수도 있습니다. 이것을 읽으십시오 . 당신은 C (안 C ++)에 있다면 당신은 그래서 가끔하는 VLA 안전 사용하는 유일한 시간은 알 의 최대 크기 n
에 int a[n]
할 수 없습니다 스택 오버 플로우 및 VLA의 선언이 범위의 상단에 당신 현재에서 선언하고 있습니다. alloca
(c99 이전에 VLA를 사용하는 유일한 방법이었던) 제작자는 동의하는 것 같습니다.
여기 에서 발췌 -
다음과 같은 형식으로 alloca ()를 사용할 수 있습니다.
pointer_variable = alloca (표현식);
함수 의 가장 바깥 쪽 블록에있는 표현식 문으로 .
아 그리고 당신의 편집에 답하기 위해 :
답변 해 주셔서 감사합니다. 일부 사용자는 a [n]을 입력하여 배열을 선언하는 것은 허용되지 않는다고 응답했습니다. 그러나 다음 코드를 입력하면 프로그램이 제대로 실행되는 이유는 무엇입니까?
컴파일러가 허용하기 때문입니다. 그러나 표준은 그렇지 않습니다. 그래서 이런 종류의 것들은 좋은 ol ' "내 기계에서 작동했습니다!"를 낳을 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다