[운영체제] C언어 메모리 구조

2020. 3. 19. 14:32공부/전공

C언어의 메모리 구조 정리

  • 프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드(load)되어야 한다.

  • 프로그램을 실행시키면 운영체제메모리 공간을 할당한다.

    • 할당 시기 : 프로그램이 실행 될 때 마다

    • 할당 장소 : 메인 메모리 (RAM)

    • 할당 용도 : 프로그램 실행 시 필요한 메모리 공간 (지역변수, 전역변수 선언을 위해) 할당

  • 할당된 메모리 공간

    • Code

      • 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code) 영역

      • CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리

    • Data

      • 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역

      • 데이터(Data) 영역은 프로그램 시작과 함께 할당되며, 프로그램이 종료되면 소멸

    • Stack

      • 함수의 호출과 관계되는 지역변수와 매개변수가 저장되는 영역

      • 스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸

        • 이렇게 스택 영역에서 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라 함
      • 후입선출(LIFO,Last-In First-Out) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출

      • 메모리 높은 주소에서 낮은 주소의 방향으로 할당

    • Heap

      • 사용자(프로그래머)가 직접 관리할 수 있는 '그리고 해야만 하는' 메모리 영역

      • 할당해야 할 메모리의 크기를 프로그램이 실행되는 동안 결정해야하는 경우(런 타임 때) 유용하게 사용되는 공간

      • 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됨

      • 메모리 낮은 주소에서 높은 주소의 방향으로 할당

      • 문제 예시

        • 비정상적인 배열 선언 1

          int i=0; 
          scanf("%d",&i); 
          int arr[i];
          • 스택 영역에 할당될 메모리 크기는 컴파일 타임 결정된다.

          • i의 크기가 4바이트인 것은 알 수 있지만, arr이라는 배열의 크기는 알 수 없다.

        • 비정상적인 배열 선언 2

          int i=10; 
          int arr[i];
          • 컴파일 하는 동안 i가 4바이트의 크기라는 것을 알 수 있지만, 그 값이 10으로 초기화 되었다는 사실은 무시하고 넘어간다.

          • 값이 10으로 초기화 되었다는 사실은 런 타임에 결정 된다.

          • 따라서, 컴파일러는 arr의 크기가 40바이트가 된다는 사실을 알 수 없다.