Contents

Develop
2003.04.23 10:56

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

조회 수 8198 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
변수의 스코프(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
번호 분류 제목 글쓴이 날짜 조회 수
841 Develop '2014 모바일 개발 트렌드' 발표자료입니다. file hooni 2014.10.02 989
840 Develop Aspect Oriented Programming in Objective-C hooni 2015.05.18 677
839 Develop DDay Memo 1.9.4 소스코드 secret hooni 2015.10.03 0
838 Develop GCM 사용하기 2 (단말에 GCM 구현하기) file hooni 2013.07.06 23248
837 Develop GCM 사용하기 3 (JSP로 GCM 푸시 서버 만들기) 4 file hooni 2013.07.06 25316
836 Develop git 브런치 배우기 (링크) hooni 2013.07.09 20571
835 Develop GPL, AGPL, MPL,.. 한눈에 보는 오픈소스SW 라이선스 file hooni 2014.10.14 1147
834 Develop How to Test SMTP AUTH using Telnet hooni 2018.04.05 1345
833 Develop JSON, BSON 변환 file hooni 2013.04.23 11814
832 Develop Laravel 5 Failed opening required bootstrap/../vendor/autoload.php hooni 2018.01.24 1665
831 Develop Mac OS 에 Jenkins 설치하기 (Homebrew) 2 file hooni 2017.03.15 8142
830 Develop macOS에 node, npm 설치하기 (homebrew) file hooni 2021.11.06 1154
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 71 Next
/ 71