Develop
2003.04.23 10:56
[c] 스토리지 클래스(변수)
조회 수 8411 댓글 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
번호 | 분류 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|---|
181 | Develop | [c] fgets() 함수 사용하기.. | hooni | 2003.04.23 | 8057 |
180 | Develop | [c] 싱글, 더블 링크리스트(linked list)로 만든 예제.. | hooni | 2003.04.23 | 6994 |
179 | Develop | [c] 컴파일러 선행처리기 따라하기.. | hooni | 2003.04.23 | 6890 |
178 | Develop | [c] 구조체/파일 입출력 프로그램 | hooni | 2003.04.23 | 7291 |
177 | Develop | [c++] 더블 링크리스트(linked list) 학습용 초간단 단어장 | hooni | 2003.04.23 | 9563 |
176 | Develop | [c] OpenGL 직사각형(2D) 크기 확대/축소 | hooni | 2003.04.23 | 9266 |
175 | Develop | [jsp] 정적/동적(차트생성) 이미지 전달 | hooni | 2003.04.23 | 7506 |
174 | Develop | [c] 프로세스간의 통신(파이프) | hooni | 2003.04.23 | 7068 |
173 | Develop | [c] 구조체의 설명과 예제.. | hooni | 2003.04.23 | 8601 |
172 | Develop | [c] 포인터와 함수포인터에 대해.. | hooni | 2003.04.23 | 8213 |
» | Develop | [c] 스토리지 클래스(변수) | hooni | 2003.04.23 | 8411 |
170 | Develop | [c] 시간 관련 함수 설명과 예제.. | hooni | 2003.04.23 | 11740 |