c3171700   2년 전

계속 돌려보는데 900만 정도 넘어가면 Segmentation Fault : 11 오류가 나오는데 

어느부분이 잘못된걸까요 ?

djm03178   2년 전

900만이 아니라 90만을 잘못 말씀하신 거라고 이해하겠습니다.

가상 메모리 영역은 크게 몇 가지 영역으로 나뉘는데, 그 중에 지역 변수나 함수의 호출 정보 등은 스택 영역이라는 곳에 만들어집니다.

스택 영역은 함수가 호출되고 지역 변수가 선언될 때마다 쌓여 자라나고, 함수가 종료되면 하나씩 사라집니다.

그런데 이 영역은 대체로 제한이 되어 있고, 윈도우즈의 경우 1MB, 리눅스의 경우 8MB가 기본값으로 되어 있습니다. 이 크기를 초과하려고 하면 스택 오버플로가 나게 됩니다.

이 코드에서 큰 수에 대해 그 문제가 발생하는 원인은 10번째 줄에서 -1에 대해서 가장 먼저 재귀호출을 하는 데에 있는데, 가장 위에 있기 때문에 8번째 줄에 걸려드는 일이 없이 1까지 1씩 감소하며 전부 호출을 하게 됩니다. 이 과정에서 호출이 100만번 정도 쌓이는데 여기에 필요한 정보는 8MB가 넘어갑니다.

c3171700   2년 전

djm03178 님, 

계속 배열 크기만 생각했지, 어쩌면 가장 기본적인 것인데 생각지도 못하고 있었네요.. 부끄럽네요 //

친절한 답변 감사드립니다 !

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