Develop
2003.04.23 10:56
[c] 스토리지 클래스(변수)
조회 수 8198 댓글 0
변수의 스코프(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
번호 | 분류 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|---|
345 | Develop | [js] 네이버, 다음의 플레이어 스킨 | hooni | 2013.04.23 | 6943 |
344 | PPT | [doc] 위탁과제 제안서와 발표자료(pdf) | hooni | 2013.04.23 | 12535 |
343 | Develop | [js] 윈도우 시작버튼처럼 나오는 메뉴 | hooni | 2013.04.23 | 6744 |
342 | PPT | [network] tcp/ip 설명 html파일 9장(ppt 포함) | hooni | 2013.04.23 | 11651 |
341 | System/OS | [linux] 파일내 문자열 찾아 바꾸기 | hooni | 2013.04.23 | 12196 |
340 | Develop | [c] 맵서치인 듯(옛날 컴에서 찾은 자료) | hooni | 2013.04.23 | 6905 |
339 | Develop | [switch] 시스코 스위치(catalyst 2950) telnet 설정 | hooni | 2013.04.23 | 11273 |
338 | Develop | [c] 디피-헬만 키교환(Diffie–Hellman key exchange) 샘플 코드.. ㅋㄷ | hooni | 2013.04.23 | 9112 |
337 | Develop | [mysql] 양력, 음력 DB데이터 | hooni | 2013.04.23 | 7803 |
336 | Develop | [c] 파일(int fd)에서 개행문자 단위로 읽기 by 후리자 | hooni | 2013.04.23 | 7153 |
335 | System/OS | [perl] 영규가 만든 스크립트.. 하하.. | hooni | 2013.04.23 | 10598 |
334 | Develop | [c] 지폰(gphone) 소스.. 수정(암호화) | hooni | 2013.04.23 | 7435 |