본문 바로가기

Development/Coding

C 코딩 시 로컬 메모리 변수 구분

C 코딩을 하면서 가장 중요하게 고려해야 하는 부분 중 하나라고 생각되어 정리 겸 기록을 남깁니다.


프로그램은 메모리의 4개 영역으로 구분됨

  • TEXT(소스코드)
  • BSS(초기화되지 않은 변수) : 글로벌 변수 중 초기화되지 않은 경우 담김, 그래서 가능하면 글로벌 변수는 초기화 해주는 것이 좋음.
  • STACK
  • HEAP


로컬 변수의 종류


지역 변수 타입 auto, static, extern, register 가 있다.

  • auto 는 스택 세그먼트에 저장되고: 스코프에 따라 자동으로 소멸된다.
  • static 은 데이터 세그먼트에 쌓인다: 프로그램이 종료될 때까지 유지된다.
  • register 는 레지스터를 변수 메모리로 사용하고: 임베디드 시스템에 종종 사용된다고 한다.
  • extern 은 다른 파일에 정의된 변수를 사용하기 위해 선언된다: 외부 파일의 전역변수가 해당될 수 있다.


각 세그먼트는

  • 스택: auto, local 스코프 변수가 사용하는 메모리 영역, 임시 메모리 성격, 작고 빠르다. 대략 1MB 수준.
  • 힙: 동적 할당되는 메모리 영역, 크다. 1GB 정도도 가능.
  • 텍스트: 실행 파일에 속해 있는 기계어가 담긴 부분, 이 영역을 고치면 해킹!
  • 데이터: immutable 문자열 같은 상수나 정적 변수, 전역 변수들이 저장된다. 힙 처럼 자동으로 관리된다.

로 구분된다.


글로벌 영역 (함수 밖)의 static 은 해당 파일 내에서만 접근하기 위한 제한자로 사용된다. 선언하지 않을 경우 헤더 파일에 extern 으로 해당 변수를 선언하고 다른 파일에서 참조하여 (#include) 접근할 수 있게 된다.