블로그 이미지
하루, 글. 그림. 영상매체. 표현을 도와주는 기기들. 도전 중. 동화다아아
    동화다아아

    카테고리

    분류 전체보기 (176)
    잡담 (1)
    IT 기기-리뷰&뉴스 (7)
    리뷰 - 도서 (1)
    리뷰 - 영상 (0)
    리뷰 - 그림/음악 (1)
    내장형 하드웨어 (163)
    Total
    Today
    Yesterday

    - 저장 클래스(Storage Class - 분류)

    ⇒ C 언어에서 변수와 함수는 저장 클래스를 가진다. 저장 클래스는 변수와 함수의 지속기간(duration)과 유효범위(scope)를 명시해 준다. 저장 클래스의 설정이유는 변수와 함수에 지속기간과 유효범위를 부여함으로써 메모리를 효율적으로 사용하고 프로그래밍 오류를 줄이기 위해서이다. 저장 클래스에는 auto, register, static, extern의 네 가지가 있다.


    ⇒ 지속기간

     → 지속기간은 프로그램의 실행 중에서 시간상으로 존재하는 기간을 말한다.

     → auto 클래스는 가장 많이 사용되는 것으로 함수 내에서 저장 클래스를 명시하지 않고 사용되는 변수들이다.

     → auto 클래스의 변수는 함수 내에서 선언되어 함수가 실행을 시작할 때 생성되어 함수가 실행을 종료하면 소멸된다.

     → register 클래스는 컴파일러가 CPU의 레지스터 중 하나를 이 변수로 사용하게 한다. 따라서 register 변수의 크기는 register의 크기보다 클 수 없다.

     → 또 레지스터의 숫자가 작으므로 프로그램 내에서 register로 선언된 변수라도 컴파일러가 레지스터를 배정하지 않을 수 있다.

     → register 클래스도 auto 클래스와 마찬가지로 함수의 실행과 함께 생성되었다가 함수의 실행이 종료되면 소멸된다.

     → static 클래스와 extern 클래스는 auto 클래스나 register 클래스와는 달리 함수의 실행이 끝난뒤에도 남아있는 변수이다.

     → static 클래스는 함수의 내부에서나나 외부에서 모두 선언될 수 있고 extern 클래스는 함수의 외부에서만 선언된다.

     → static 변수는 초기화를 하지 않아도 시스템에 의해서 자동적으로 0이나 NULL로 초기화 된다.


     

    - 각 영역에 대한 복습

    ⇒ CODE → 함수에 대한 기계어 코드가 들어감.

    ⇒ DATA → 초기값 있는 전역변수, 배열, static으로 선언된 변수가 들어감.

    ⇒ BSS → 초기값 없는 전역변수, 배열, static으로 선언된 변수가 들어감.

    ⇒ HEAP → 동적할당(malloc)으로 할당된 변수가 들어감.

    ⇒ STACK → 블록내에서 할당된 변수가 들어감.




     

    #include<stdio.h>

    int A2 = 100;
    int A3;
    void test(void);

    int main()
    {
            
    static int A; // static을 붙이면 Data or BSS 영역
            
    int B;
            
    static int A1;
            
    static int A4=100// 초기화를 하면 Data 아니면BSS
            
    static int A5; 
            
    static int A6;
            
    static int A7=5;
            
    static int A8; 
            
    static int A9;
            
    static int A10;

            printf(
    "===================\n");
            printf(
    "&A     : %08X\n"&A);
            printf(
    "&B     : %08X\n"&B);
            printf(
    "main   : %08X\n", main);

            printf(
    "===================\n");
            printf(
    "A      : %d\n", A);
            printf(
    "B      : %d\n", B);
      
            printf(
    "===================\n");
            printf(
    "&A1    : %08X\n"&A1);
            printf(
    "&A2    : %08X\n"&A2);
            printf(
    "7&A3    : %08X\n"&A3);
            printf(
    "&A4    : %08X\n"&A4);
            printf(
    "&A5    : %08X\n"&A5);
            printf(
    "&A6    : %08X\n"&A6);
            printf(
    "&A7    : %08X\n"&A7);
            printf(
    "&A8    : %08X\n"&A8);
            printf(
    "&A9    : %08X\n"&A9);
            printf(
    "&A10   : %08X\n"&A10);
     
            printf(
    "===================\n");
            

            test();
            
    return 0;
    }

    void test(void)
    {
            printf(
    "A2 : %d\n", A2);
    }

    ⇒ 출력 결과

     

    ⇒ 저역 변수는 모든 함수가 다 접근 할 수 있다.

    ⇒ static은 전역 변수일 때와 지역변수일 때가 전혀 다르다.

    Posted by 동화다아아
    , |

    최근에 달린 댓글

    최근에 받은 트랙백

    글 보관함