Develop
2003.04.23 10:56

[c] 스토리지 클래스(변수)

Views 8197 Votes 0 Comment 0
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print
변수의 스코프(scope): 변수가 프로그램내에서 사용될 수 있는 범위
변수의 라이프타임(lifetime): 변수가 존재하는 시간(기간)
스토리지 클래스(storage class): 스토리지 클래스는 변수의 스코프와 라이프타임을 결정한다.

스토리지 클래스 종류
1. extern : 전역변수 
        스코프: 프로그램 전체
        라이프타임: 프로그램이 실행되는 모든 시간

2. auto: 지역 변수
        스코프: 변수가 선언된 블락이나 함수
        라이프타임: 변수가 선언된 함수나 블락이 실행되는 동안

3. static: 정적 변수
        스코프: 변수가 선언된 블락이나 함수
        라이프타임: 프로그램이 실행되는 모든 시간 동안

4. register: 레지스터 변수, 프로그램의 최적화를 위해 사용된다.
        스코프: auto와 동일
        라이프타임: auto와 동일

*변수는 정의되기 전에 사용될 수 없다.

예제: storage.c
     1  #include <stdio.h>
     2
     3  int  extern_int = 10;
     4
     5  int add(int a, int b) {
     6      auto    int  auto_int;
     7      static  int  static_int;
     8
     9      auto_int = a + b + extern_int;
    10      static_int +=  auto_int;
    11      printf("tadd::auto_int = %dn", auto_int);
    12      printf("tadd::static_int = %dn", static_int);
    13      return auto_int;
    14  }
    15
    16  main(int argc, char ** argv) {
    17      register  int  i, sum = 0;
    18      auto      int  d;
    19
    20      for(i=0; i < 5; i++) {
    21          d = i*i;
    22          extern_int++;
    23          sum += add(i, d);
    24          printf("n");
    25      }
    26      printf("sum = %d n", sum);
    27  }

결과
#7 enterprise:/data1/student/c9844000% storage
        add::auto_int = 11
        add::static_int = 11

        add::auto_int = 14
        add::static_int = 25

        add::auto_int = 19
        add::static_int = 44

        add::auto_int = 26
        add::static_int = 70

        add::auto_int = 35
        add::static_int = 105

sum = 105 


예제: storage2.c
     1  #include <stdio.h>
     2
     3  int  value = 10;
     4
     5  main(int argc, char ** argv) {
     6      register  int  i;
     7
     8      printf("value = %dn", value);
     9      for(i=0; i < 5; i++) {
    10          int value = 20;
    11          if(i == 2) {
    12              int value = 30;
    13              printf("ttvalue = %dn", value);
    14          } else {
    15              printf("tvalue = %dn", value);
    16          }
    17      }
    18      printf("value = %dn", value);
    19  }


결과
#15 enterprise:/data1/student/c9844000% storage2
value = 10
        value = 20
        value = 20
                value = 30
        value = 20
        value = 20
value = 10

예제: storage3.c
     1  #include <stdio.h>
     2
     3  int  value = 10;
     4
     5  main(int argc, char ** argv) {
     6      register  int  i;
     7
     8      printf("value = %dttt:&value = %pn", value, &value);
     9      for(i=0; i < 5; i++) {
    10          int value = 20;
    11          if(i == 2) {
    12              int value = 30;
    13              printf("ttvalue = %dt:&value = %pn", value, &value);
    14          } else {
    15              printf("ttvalue = %dt:&value = %pn", value, &value);
    16          }
    17      }
    18      printf("value = %dttt:&value = %pn", value, &value);
    19  }

결과
#22 enterprise:/data1/student/c9844000% storage3
value = 10                      :&value = 20b08
                value = 20      :&value = effffa38
                value = 20      :&value = effffa38
                value = 30      :&value = effffa34
                value = 20      :&value = effffa38
                value = 20      :&value = effffa38
value = 10                      :&value = 20b08


예제: storage4.c
     1  #include <stdio.h>
     2
     3  int  value = 10;
     4
     5  main(int argc, char ** argv) {
     6      register  int  i;
     7
     8      printf("value = %dttt:&value = %pn", value, &value);
     9      for(i=0; i < 5; i++) {
    10          static int value = 20;
    11          if(i == 2) {
    12              int value = 30;
    13              printf("ttvalue = %dt:&value = %pn", value, &value);
    14          } else {
    15              printf("ttvalue = %dt:&value = %pn", value, &value);
    16          }
    17      }
    18      printf("value = %dttt:&value = %pn", value, &value);
    19  }

결과
#28 enterprise:/data1/student/c9844000% storage4
value = 10                      :&value = 20b10
                value = 20      :&value = 20b14
                value = 20      :&value = 20b14
                value = 30      :&value = effffa38
                value = 20      :&value = 20b14
                value = 20      :&value = 20b14
value = 10                      :&value = 20b10


예제: storage5.c
     1  #include <stdio.h>
     2
     3  int  value = 10;
     4
     5  main(int argc, char ** argv) {
     6      register  int  i, sum = 0;
     7
     8      printf("sum = %dttt:&sum = %pn", sum, &sum);
     9      printf("value = %dttt:&value = %pn", value, &value);
    10      for(i=0; i < 5; i++) {
    11          static int value = 20;
    12          if(i == 2) {
    13              int value = 30;
    14              printf("ttvalue = %dt:&value = %pn", value, &value);
    15          } else {
    16              printf("ttvalue = %dt:&value = %pn", value, &value);
    17          }
    18      }
    19      printf("value = %dttt:&value = %pn", value, &value);
    20  }

컴파일
#32 enterprise:/data1/student/c9844000% cc -o storage5 storage5.c
"storage5.c", line 8: cannot take address of register: sum

#34 enterprise:/data1/student/c9844000% gcc -o storage5 storage5.c
storage5.c: In function `main':
storage5.c:8: warning: address of register variable `sum' requested


예제: storage6.c
     1  #include <stdio.h>
     2
     3  int  extern_int = 10;
     4  extern int add(int, int);
     5
     6  main(int argc, char ** argv) {
     7      register  int  i, sum = 0;
     8      auto      int  d;
     9
    10      for(i=0; i < 5; i++) {
    11          d = i*i;
    12          extern_int++;
    13          sum += add(i, d);
    14          printf("n");
    15      }
    16      printf("sum = %d n", sum);
    17  }
    18
    19  int add(int a, int b) {
    20      auto    int  auto_int;
    21      static  int  static_int;
    22
    23      auto_int = a + b + extern_int;
    24      static_int +=  auto_int;
    25      printf("tadd::auto_int = %dn", auto_int);
    26      printf("tadd::static_int = %dn", static_int);
    27      return auto_int;
    28  }

결과
#37 enterprise:/data1/student/c9844000% storage6
        add::auto_int = 11
        add::static_int = 11

        add::auto_int = 14
        add::static_int = 25

        add::auto_int = 19
        add::static_int = 44

        add::auto_int = 26
        add::static_int = 70

        add::auto_int = 35
        add::static_int = 105

sum = 105 


예제: storage7.c 
     1  #include <stdio.h>
     2
     3  int  value = 10;
     4
     5  main(int argc, char ** argv) {
     6      register  int  i;
     7      int       value = 20;
     8
     9      printf("value = %dn", value);
    10      for(i=0; i < 5; i++) {
    11          extern int value;
    12          if(i == 2) {
    13              int value = 30;
    14              printf("ttvalue = %dn", value);
    15          } else {
    16              printf("tvalue = %dn", value);
    17          }
    18      }
    19      printf("value = %dn", value);
    20  }

결과
#45 enterprise:/data1/student/c9844000% storage7
value = 20
        value = 10
        value = 10
                value = 30
        value = 10
        value = 10
value = 20

?

List of Articles
No. Category Subject Author Date Views
713 Develop [web] 더 빠른 웹을 위한 프로토콜, 'HTTP/2' file hooni 2014.10.20 1641
712 Develop Laravel 5 Failed opening required bootstrap/../vendor/autoload.php hooni 2018.01.24 1652
711 Develop [ios] @property의 속성 (strong, weak, copy) 사용 경우 hooni 2014.08.08 1656
710 Develop [c] 한글 문자열 출력 hooni 2015.11.10 1675
709 Develop [python][django] request.cookie 읽어오기 ㅋㅋㅋ (쓰기) hooni 2019.12.06 1686
708 Develop [php] mysql_ 과 mysqli_ 의 차이 hooni 2017.12.01 1691
707 Develop [swift] UIView에서 subview 찾기 hooni 2022.12.09 1747
706 Develop [iOS] Xcode 불필요한 캐시 삭제하기 hooni 2021.10.12 1782
705 Develop [iOS] 시뮬레이터에 푸시 알림을 보내는 방법 file hooni 2021.10.13 1782
704 Develop [ios] Xcode cannot run using the selected device hooni 2014.08.14 1787
703 Develop [ios] Objective-C 에서 자주 사용하는 수학 함수와 유용한 Define hooni 2014.08.08 1858
702 Develop [php][laravel] 초간단 MacOS에서 Laravel 개발 환경 구축 hooni 2017.12.15 1869
701 Develop [ios] 카메라 사용 권한 확인해서 분기하는 방법 hooni 2015.02.26 1869
700 Develop [android] 가속도 센서를 이용한 흔듦(Shake) 감지 file hooni 2014.11.04 1898
699 Develop [ios] 웹뷰 history.back() ㅋㄷ file hooni 2016.06.27 1899
698 Develop [matlab] ZigZag-Scanning (2-D Array) file hooni 2016.10.15 1982
Board Pagination Prev 1 ... 7 8 9 10 11 ... 53 Next
/ 53