ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C언어] 5-4. 기억클래스
    프로그래밍/C 2014. 4. 6. 23:37
    반응형

    1. 지역변수와 전역변수


    * 지역변수 (자동변수)

    - 지역변수는 함수나 임의의 블록 내부에서 선언된 변수로 자신이 선언된 함수나 한 블록 내에서만 사용이 가능하고 그 영역을 벗어나면 자동으로 메모리를 반납하고 사라진다.

    - 메모리의 영역 중 Stack이라 부르는 임시저장영역에 위치한다.

    - 지역변수는 초기화하지 않으면 쓰레기값이라 부르는 의미 없는 아주 작은 값으로 채워지므로 계산식에 바로 사용할 경우에는 미리 초기화해서 사용하면 예기치 않은 에러를 줄일 수 있다.




    * 전역변수

    - 전역변수는 함수의 외부에서 선언된 변수로 한 프로그램 내에서 사용이 가능하므로, 프로그램을 구성하고 있는 함수나 블록에서 모두 접근 가능

    - 전역변수들은 메모리 영역 중 공유데이터 영역에 위치하게 되고 프로그램이 종료될 때까지 유효하므로 프로그램 종료 시에 메모리를 반납하고 사라진다.

    - 전역변수는 초기화하지 않으면 자동으로 0으로 초기화된다.


    2. 기억클래스의 종류

    - 기억클래스란 변수가 메모리의 어느 부분을 어떻게 할당받는지를 나타내는 것으로 변수가 할당받은 위치에 따라 변수의 사용범위가 제한되거나 유효기간(메모리에 남아 있을 수 있는 시간), 초기화되는 값 등이 달라진다.

    - 기억클래스에 따른 변수의 종류를 나누면 자동변수(지역변수), 전역변수, 외부변수, 정적변수, 레지스터 변수로 분류되며 각 변수의 메모리 할당영역은 다음 표와같다.

     메모리 영역

    유효범위 및 기간 

    초기화 

    할당 변수 

    스택(Stack) 

    함수, 블록 내에서 사용, 범위를 벗어나면 사라짐

    쓰레기값

    지역변수, 매개변수 

    공유데이터(Shared Data) 

    프로그램 내 어디서든 접근가능, 프로그램 종료시까지 유효 

    숫자 0 

    전역변수, 정적변수, 외부변수 

    힙(Heap) 

    malloc(), free(), calloc(), realloc() 등 함수를 통해 접근가능, 시스템 종료시까지 유효 

    숫자 0 

    메모리 동적 할당 

    CPU 내 레지스터 

     

     

    레지스터 변수 


    * 지역변수와 전역변수 사용

    - 예제로 설명하여 스킵


    * 외부변수 사용

    - 프로그램을 구성하는 파일이 여러 개가 있을 때 외부 파일에서 선언된 변수나 다른 함수에서 선언된 변수를 공유해서 사용하고자 할 때 변수명 앞에 extern으로 지정해서 외부변수가 할당된 메모리 영역을 공유하는 변수

    - 메모리 영역 중 공유데이터 영역에 위치하게되고 프로그램이 종료될 때까지 유효하므로 프로그램 종료 시에 메모리를 반납하고 사라진다.

    - 초기화하지 않으면 자동으로 0으로 초기화


    * 정적변수 사용

    - 변수명 앞에 static을 지정하여 선언하며 실행 중에 변수에 저장된 값을 계속 유지하도록 고정되어 있는 변수로 메모리의 공유데이터 영역에 위치하게 된다.

    - 프로그램이 종료될때까지 유효하므로 값을 유지하다가 프로그램 종료 시 메모리를 반납하고 사라진다.

    - 함수 안에 선언된 지역변수의 경우도 static으로 고정시키면 함수가 종료되더라도 그 내용이 지워지지 않고 프로그램이 종료될 때 까지 값을 유지

    - 초기화하지 않으면 자동으로 0으로 초기화


    * 레지스터 변수 사용

    - CPU내에 위치한 임시기억장소인 레지스터에 자료를 저장하고자 할 때 사용 선언하는 변수로 변수명 앞에 register로 지정하여 선언

    - 레지스터 변수는 용량이 작아서 많은 데이터를 저장할 수 없으므로 프로그램의 실행속도를 높이기 위해 주로사용

    - 초기화하지 않으면 쓰레기값으로 초기화




    3. 메모리 할당 기법

    - 변수에 메로리 공간을 할당하는 방법에는 크게 2가지가 있는데 첫째로 프로그램을 작성할 때 필요한 기억공간의 크기를 결정해서 할당하는 메모리의 정적 할당 기법과 프로그램 실행 중에 입력되는 자료의 크기에 맞추어 기억 공간의 크기를 할당하는 메모리의 동적 할당 기법이 있다.


    * 메모리 정적 할당

    - 프로그램 작성 시 변수나 배열의 크기를 정해서 필요한 만큼의 메모리 공간을 미리 할당하는 것을 메모리의 정적 할당이라고 한다.

    - 프로그램이 사용할 변수의 크기를 정확하게 알고 있는 경우는 정적 할당 기법을 사용하는것이 적합하지만 정확하게 알지 못하는 있는 경우에는 기억 공간을 미리 할당하면 크기가 너무 커서 남는 공간이 생기거나 작아서 데이터가 손상되는 문제가 발생할 수 있다.


    * 메모리 동적 할당

    - 메모리 공간 중 힙(Heap) 영역에 프로그램 실행 도중에 입력되는 자료의 크기만큼 기억공간을 할당하는 것

    - 힙 공간을 할당받는 변수의 경우 프로그램 종료, 시스템 전원이 오프될 때까지 그 내용이 저장

    - 실시간으로 배열의 크기를 결정해서 사용해야 할 경우 유용

    - 기억 공간의 낭비를 막을 수 있다.


    * 정리후기

    - 다음장에서는 포인터, 그리고 그 다음장에서는 포인터를 다룬다. 항상 느끼는거지만 코드를 예제로 넣을수 없다는게 아쉽다. (귀찮기도하고;;)..

    반응형

    '프로그래밍 > C' 카테고리의 다른 글

    [C언어] 6-2. 포인터  (0) 2014.04.07
    [C언어] 6-1. 배열  (0) 2014.04.07
    [C언어] 5-4. 기억클래스  (0) 2014.04.06
    [C언어] 5-3. 사용자 정의 함수  (0) 2014.04.05
    [C언어] 5-2. 표준함수  (0) 2014.04.05
    [C언어] 5-1. 함수의 개념  (0) 2014.04.05

    댓글 0

Designed by Tistory.