SRM 388 Div2 Level3 를 풀다 생긴 질문~

  • soyoja
    soyoja

    SRM 388 Div2, Level3 를 풀다가 질문입니다.
    보통 이 문제를 풀기 위해 (int * 5,000,000 = 약 20메가 쯤 되겠군요) 만큼의 메모리를 확보하는데,
    클래스 내에서 멤버변수로 int chk[5000000] 를 선언하면 탑코더 시스템 테스트에서 segmentation fault 가 나더군요.
    아마도 탑코더 컴파일러에서 지원하는 정적변수의 메모리 크기를 초과하는게 아닐까라고 생각했는데...
    전역변수로 int chk[5000000] 를 선언하면 아무 문제가 없더군요..
    정적으로 메모리를 확보하는 것은 동일한 것 같은데...

    왜 이런 차이가 있는 걸까요?

    [이 글은 과거 홈페이지에서 이전된 글입니다. 원문보기]

    16년 전
2개의 댓글이 있습니다.
  • nocut98
    nocut98

    클래스 내에서 멤버 변수로 선언 후에 C c; 요런 식으로 하면 스택에 메모리가 잡힐 거구요.
    전역변수로 선언하시면, static메모리 영역에 잡혀서 그런 게 아닐까요?
    추기로 C * c = new C(); 요런 식이라면, 힙에 잡혀서 클래스 내에서 멤버변수로 선언해도 문제가 없겠죠.
    제가 틀린 부분이 있거나 좀 더 자세하게 아시는 분은 추가 리플 부탁드립니다.
    덧. 왜 전역변수는 static메모리 영역이 잡히냐면, Scope과 상관이 있겠죠. 지역변수는 함수콜이 끝나면 해제 되는데 반해 전역변수는 계속 살아있어야 하기 때문에 스택에 잡을 수가 없는 겁니다.


    16년 전 link
  • soyoja
    soyoja

    아... 그렇군요. 답변 감사합니다... ^^:


    16년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.