anfdjqkd   1년 전

preview

배열 정의를 소스코드의 방법이 아닌,

int * lol;

lol=new int[count];

로 하면 오류가 발생하지 않았습니다. 

둘 다 백준에서는 정답처리됬으나 소스코드에 나와있는 대로 치면 비쥬얼 스튜디오에서는 위 사진처럼 오류가 발생하네요!

왜 그렇고, 효과적으로 해결하는 방법이 무엇인지 궁금합니다!!

adung7   1년 전

사진의 오류는 Stack overflow 오류로 메모리 영역중에 스택 영역이 있는데 이는 통상적으로 1MB로 잡아둡니다. (visual studio 설정에서 바꿀수도 있음)

이 스택 영역에는 지역 변수를 저장해두는데 10번째줄에서 지역변수로 1,000,000의 int배열을 선언하셨고 이는 4(int) * 1,000,000 -> 4,000,000 byte -> 약 3,906 KB -> 약 4MB 로

스택 영역이 가질수 있는 메모리공간을 초과하여 할당하고 있음으로 스택 오버플로우가 발생하게 됩니다.

다만, 백준에서는 제가 알기론 스택 메모리 영역의 제한이 없는것으로 알고있습니다. 따라서 백준에서는 작성자님 코드가 돌아갈것입니다.

또한, new int[count]에서는 작동하는 이유가 new 연산자를 통해 메모리 할당을 받은경우 스택에 저장되지 않고 메모리 영역중 스택과 다른 영역인 힙 영역에 저장되게 됩니다.

이 힙 영역은 스택보다 매우 커서 4,000,000 byte의 메모리를 할당받을 수 있게 되는것입니다.

앞으로도 이런 큰 배열을 선언할땐 스택에 할당하는것보단 작성자님이 해결하신 힙 영역에 할당하시거나 전역 변수(데이터 영역)로 설정하시면 해결됩니다.

anfdjqkd   1년 전

단번에 완전히 이해했네요 감사합니다 >_<

댓글을 작성하려면 로그인해야 합니다.